X

Notes d’annonce de fonctionnalité 5.3 de Laracon


Une fois les vidéos publiées, je pourrai mettre à jour ce message avec plus d’informations, car j’étais sur un flux audio uniquement pour la majorité de cela.


J’écrirai mes articles de blog habituels plus longs et approfondis sur chacune des nouvelles fonctionnalités 5.3 qui seront publiées lors de la conférence Laracon de Taylor aujourd’hui, mais je voulais trouver un seul endroit pour écrire mes notes sur les nouvelles fonctionnalités que Taylor est annonçant pour la première fois aujourd’hui, alors je me suis dit, pourquoi ne pas le mettre dans un seul article de blog ici ?

Ce ne sont que mes notes du flux en direct. Je mettrai à jour cela plus tard avec plus d’informations, puis j’écrirai des articles complets; ce ne seront que des notes informelles.


Éclaireur de Laravel

Introduction au Scoutisme

Pilote de recherche/ElasticSearch ; emballé séparément comme Caissier. Fonctionne mieux avec Algolia mais aimerait le soutien de la communauté pour les autres conducteurs.

Le modèle va avoir un trait Searchable.

Indexation avec Scout

Indexe le toArray() fonction sur le modèle et le place dans l’index de recherche.

Ajouter ScoutServiceProvider pour config/app et Searchable trait à votre modèle.

Le trait s’accroche aux événements éloquents. Écoute ces événements et met à jour vos index en réponse.

Remplacements spéciaux/etc.

Fermeture qui permet de passer outre l’indexation :

Post::withoutSyncingToSearch(function () {
    // make a bunch of posts, e.g.
    factory(Post::class, 10)->create();
});

… puis mettez à jour tous ceux-ci plus tard :

// Could just scope down the query to only those which you haven't indexed yet if you want...
Post::all()->searchable();

Aussi pourrait faire : ceci sur une relation

$user->posts()->searchable();

C’est assez intelligent pour ressembler à “upsert” ; il met à jour ceux qui s’y trouvent déjà et en insère de nouveaux.

Peut également supprimer de la recherche :

// didn't catch the syntax for this one, sorry! probably something like Post::where('a', 'b')->unsearchable();

Files d’attente/etc.

Ces interactions semblent lentes, logiques ; ce sont des requêtes HTTP sortantes !

Donc : dans config/scout.php ensemble queue pour true afin que ces mises à jour soient configurées pour être synchronisées de manière asynchrone.

// not sure what this does or whether i wrote this syntax down right, feed was cutting out
php artisan scout:import App\Post

Recherche avec Scout

Vous pouvez rechercher… quelque chose comme :

Post::search('Alice')->get();
Post::search('Alice')->paginate(20);
Post::search('Alice')->where('account_id', 2)->get();

Il ne peut pas faire toute la gamme des clauses SQL where, mais il gère les bases.

Envois postaux

Vous voulez simplifier le courrier, donc créer des objets courrier :

Mail::to($user)->send(new DeploymentCompleted($server));

DeploymentCompleted est une classe PHP ; il représente un e-mail.

// mailable class
public function construct($server)
{
    $this->server = $server;
}

public function build()
{
    return $this->view('emails.whatever.viewname');

    // second parameter is an optional array of specific data that you want to be available to view:

    return $this->view('emails.whatever', ['explicit_data_passed' => 'abc']);
}

Toutes les propriétés publiques de l’objet mailable sont accessibles dans la vue, vous ne ont pour transmettre explicitement toutes les données.

Envoyer à plusieurs

Mail::to(User::find(1))
    ->cc(User::find(2))
    ->bcc(User::find(3))
    ->send(new etc.);

Mail::to(Users::all())
    ->send(new etc.);

Mise en file d’attente des e-mails

Mail::to($user)->queue(new etc.);

Pièces jointes

Toutes les mêmes méthodes que vous avez dans votre fermeture de courrier comme attach.

public function build()
{
    return this->view()->subject()->attach();
}

Divers

Devine le sujet à partir du nom de la classe si vous ne le définissez pas explicitement. Par exemple, la classe mailable “DeploymentCompleted” obtient le sujet automatique “Deployment Completed”.

Les nouvelles fonctionnalités de notification de Laravel

Introduction à la notification

Notifications rapides. Réinitialisations de mot de passe, liens rapides, etc.

Fonctionnalités limitées. Pas de pièces jointes, CC, etc. Ceci est pas e-mail.

Le rappel de mot de passe dans 5.3 l’utilisera par défaut.

$user->notify(new DeploymentCompleted($server));

Classe de notification de base

class DeploymentCompleted
{
    public function construct($server)
    {
        $this->server = $server;
    }

    public frunction via($notifiable)
    {
        // $notifiable might be a user.. but who knows, you might want to notify a server or a slack channel or something
        // you could inspect user preferences here to decide which sort of notification they get
        // return a list of notification "drivers"
        return ['mail'];
    }

    public function message()
    {
        $this->line('You have a new deployment!')
            ->action('View Deployment', 'http://laravel.com')
            ->line('Check it out');
    }
}

Caractère notifiable.

Le pilote de messagerie est livré avec un modèle par défaut élégant, réactif, etc., mais vous pouvez également l’exporter/le publier dans votre application et le personnaliser vous-même.

Différents états :

$this->line()->action()->line()->error();

Différencier les états de notification

Certains pilotes savent différencier les états ; certains ne le font pas. Par exemple, le error state dans le pilote de messagerie recevra un gros bouton rouge au lieu d’un gros bouton bleu. Le success() l’état obtient un bouton vert.

Nouveaux paramètres dans config/app.php: name et logo pour les notifications.

Pilote de messagerie

Couvert dessus.

Pilote de base de données

Table contenant ces notifications. polymorphe; colonnes pour notifiable type, id, level, intro, outro, action text, action url, a été lu ou non. Laravel ne sait pas comment vérifier s’il est lu ou non, vous gérez cela.

Ajoutez simplement “base de données” à la via() méthode et tout d’un coup ça l’obtient; votre code d’appel ne sait pas ou ne se soucie pas via pilote qu’il va utiliser.

Conducteur lâche

Ajouter slack au via() méthode. Certains pilotes nécessitent plus d’informations. Contexte:

routeNotificationForSlack() méthode sur l’utilisateur (ou quoi que ce soit d’autre qui soit notifiable).

La convention est routeNotificationFor{drivernNameHere}.

Pour Slack, cette méthode doit renvoyer l’URL du webhook Slack : par exemple return $this->slack_webhook_url.

Pilote SMS

Ajouter nexmo ou sms, difficile à dire à partir de l’audio de Taylor. Ajoutez vos clés API Nexmo

Notifications de file d’attente

Accédez à la classe de notification et ajoutez le ShouldQueue trait. Maintenant, ils sont tous en file d’attente. Boom va la dynamite.

Passeport Laravel

Implémentation complète du serveur OAuth2 dans Laravel en 5 minutes environ !!!!!!!!!

Dans Laravel 5.2, nous avons eu A) l’idée de plusieurs pilotes d’authentification et B) l’authentification basée sur les jetons. L’authentification basée sur les jetons fonctionne, c’est bien, mais c’est plus important en tant que couche de base pour cela.

Installation de base de Passport

Étapes pour l’utiliser :

  1. Installez Passport via Composer.
  2. Aller à config/appajouter Laravel\Passport\PassportServiceProvider à votre liste de fournisseurs.
  3. Exécutez de nouvelles migrations à l’aide des multiples chemins de migration de la version 5.3. Cours juste php artisan migrate et cela inclura également les migrations Passport.
  4. Accédez à votre utilisateur et importez le trait Laravel\Passport\HasApiTokens
  5. Ajouter des itinéraires : accédez à AuthServiceProvider et utilise Laravel\Passport\Passportpuis dans le boot() exécution de la méthode Passport::routes()
  6. (facultatif) Ajoutez des étendues dans le boot() méthode de AuthServiceProvideraprès Passport::routes(); par exemple Passport::tokensCan(['conference' => 'Access your conference information'])
  7. config/auth.php, guards.api.driver; changer la api garde à utiliser passport conducteur au lieu de token

Interface de passeport

Passport expose une API JSON que votre frontend peut utiliser pour vous permettre de la gérer.

Livré avec des composants Vue par défaut pour vous faciliter la gestion, si vous voulez les utiliser. C’est juste une référence mais vous pouvez l’utiliser si vous le souhaitez.

Trois composants Vue par défaut prêts à l’emploi :

<!-- let people make clients -->
<passport-clients></passport-clients>

<!-- list of clients people have authorized to access our account -->
<passport-authorized-clients></passport-authorized-clients>

<!-- make it simple to generate a token right in the UI to play with -->
<passport-personal-access-tokens></passport-personal-access-tokens>

Pour ces exemples, Taylor a créé une application sur http://passport.dev/ sur lequel Passport est installé. Cette application fournit l’API OAuth. Puis un autre à http://example.dev/ c’est un client qui le consomme.

Regardez par défaut :

Création d’une cliente :

Une fois que vous avez créé un client, vous obtenez un secret et un ID client. Accédez à votre client consommateur (un autre site, etc.) et insérez-y cette clé et cet identifiant.

A montré un exemple d’application qui CONSOMME cette API (pas celle qui la fournit); vit à http://consumer.dev/:

// routes/web.php

use Illuminate\Http\Request;

Route::get("https://mattstauffer.com/", function () {
    $query = http_build_query([
        'client_id' => 1,
        'redirect_uri' => 'http://consumer.dev/callback',
        'response_type' => 'code',
        'scope' => 'conference'
    ]);

    return redirect('http://passport.dev/oauth/authorize?' . $query);
});

Route::get('callback', function (Request $request) {
    $http = new GuzzleHttp\Client;

    $response = $http->post('http://passport.dev/oauth/token', [
        'form_params' => [
            'grant_type' => 'authorization-code',
            'client_id' => 1, // from admin panel above
            'client_secret' => 'abc', // from admin panel above
            'redirect_uri' => 'http://consumer.dev/callback',
            'code' => $request->code
        ]
    ]);

    return json_decode((string) $response->getBody(), true)['access_token'];
});

Quand vous visitez http://consumer.dev/ il essaie de s’authentifier, vous envoyant sur le site Passport ; vous obtenez cet écran :

Lorsque vous autorisez, vous ramène à http://consumer.dev/callback et vous avez accès à votre jeton maintenant.

Pour prouver, Taylor crée un itinéraire dans son application de passeport qui renvoie simplement l’utilisateur authentifié, le place dans le routes/api.php fichier itinéraires. L’appelle depuis Postman, colle le jeton JWT d’en haut dans le Authorization header et appelle la page, et ça marche. (Authorization: Bearer TOKENHERE)

Applications faciles à révoquer dans l’interface utilisateur :

N’arrête pas de dire : “Ce n’est pas ce à quoi votre interface utilisateur doit ressembler ; c’est juste une application de référence gratuite.”

Nouveau dans Passport que le package League n’a pas : vous voulez qu’il soit facile de créer un jeton dans l’interface utilisateur pour simplement jouer avec l’API. Étant donné que chaque jeton est associé à un client (le dernier que nous avons créé était associé à http://consumer.dev), faire un client personnel : php artisan make passport:client --personal. Ensuite, vous pouvez accéder au composant Personal Access Tokens et cliquer sur “Create New Token”. les crée avec votre application (passport.dev) en tant que client répertorié.

Intergiciel de portée

Middlewares pour limiter l’accès aux routes des utilisateurs en fonction de vos portées. Ajoutez-les (quels qu’ils soient) dans le noyau HTTP. portée et portées.

Le scope le middleware vous authentifie pour un périmètre unique ; scopes nécessite toutes les portées définies.

// add to Http\Kernel $route<iddleware property
// you can name it whatever you want
'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,
'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,

Si vous souhaitez limiter l’utilisateur à accéder à un itinéraire uniquement s’il a le conference portée:

Route::get('/whatever', function () {
    // do stuff
})->middleware('scope:conference');

Les multiples peuvent être séparés par des virgules ; permet à l’utilisateur de passer s’il a n’importe quel des champs d’application fournis : ->middleware('scope:conference,otherScope'). Si vous voulez qu’il ne les laisse passer que s’ils ont tous portées passées, utiliser scopes:->middleware(‘scopes:conference,otherScope’)`.

Accès super puissant à l’API pour les vues frontales

Si vous avez une interface qui consomme l’API, vous ne voudrez peut-être pas faire toute la danse OAuth. Mais vous souhaiterez peut-être que le flux OAuth soit toujours disponible pour les utilisateurs d’API externes.

Astuce pour ton frontend – qui a déjà authentifié votre utilisateur via Laravel et les sessions – pour accéder à votre API et contourner le flux OAuth.

Aller à HTTP\Kernel et ajouter un nouveau middleware à web:

`Laravel\Passport\Http\Middleware\CreateFreshApiToken::class`,

Cela ajoute un jeton JWT en tant que cookie à toute personne connectée. Utilise “modèle de jeton synchronisé” pour intégrer le jeton CSRF dans le JWT et nécessite un en-tête CSRF si vous avez envoyé ce cookie, et ils doivent correspondre. Un peu de magie.

Sûr car les autres applications ne peuvent pas lire vos cookies et ne peuvent donc pas extraire votre jeton CSRF du jeton JWT. Boom. Peut faire des requêtes API si connecté sans se soucier des jetons OAuth.

Divers

“Mon API ne doit pas être une réflexion après coup.” Montez le tout en 15 minutes avec des démos.

Dernier package League donc ce sont des jetons JWT.

Mots clés:

Laravel

laravel 5.3

éclaireur laravel

passeport laravel

envoyable