X

Laravel 5.0 – Événements et gestionnaires


Si vous ne l’avez pas encore lu, allez lire le post Laravel 5.0 – Commands & Handlers. Cela donnera des informations indispensables pour cet article.

Avec les commandes de Laravel 5 (et leurs gestionnaires), vous pouvez, de manière simple, directe et encapsulée, émettre un commande au système. Faites ceci. HandleACommandThatIsTellingMeToDoThis. C’est impératif. Il dit au système quoi faire.

Mais parfois, soit à la suite d’une commande, soit simplement dans un autre contexte, nous souhaitons envoyer une notification beaucoup plus abstraite. Vous avez probablement vu que Laravel 4 pouvait déclencher des événements basés sur un nom d’événement de chaîne :

    $response = Event::fire('auth.login', array($user));

Cela envoie un avis au monde de l’application : “Hey ! Quelqu’un s’est connecté ! Faites ce que vous voulez avec cette information”. informatif. Si vous connaissez le concept de PubSub, c’est ce qui se passe avec les événements.

Eh bien, dans Laravel 5, le système d’événements a été mis à jour et il ressemble beaucoup plus au système de commande que nous avons vu dans le dernier message. Plutôt que d’identifier un événement basé sur une chaîne (auth.login), nous créons en fait un objet PHP et l’émettons.

Goûter

Alors, essayons.

Générer un événement

php artisan make:event ThingWasDone

… et cela génère ceci :

<?php namespace SaveMyProposals\Events;

use SaveMyProposals\Events\Event;

use Illuminate\Queue\SerializesModels;

class ThingWasDone extends Event {

    use SerializesModels;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

}

Vous pouvez attacher des données à cet objet en ajoutant des paramètres de constructeur et en les définissant comme propriétés de la classe.

Générer un gestionnaire d’événements

Vous créez ensuite un gestionnaire :

php artisan handler:event SendMailInSomeParticularContext --event="ThingWasDone"

… qui génère ceci :

<?php namespace SaveMyProposals\Handlers\Events;

use SaveMyProposals\Events\ThingWasDone;

use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldBeQueued;

class SendMailInSomeParticularContext {

    /**
     * Create the event handler.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  ThingWasDone  $event
     * @return void
     */
    public function handle(ThingWasDone $event)
    {
        //
    }

}

Notez que le générateur a déjà indiqué un type ThingWasDone $event paramètre dans le handle méthode. Vous pouvez également utiliser l’injection de dépendances, soit dans le constructeur ou dans le handle méthode, pour apporter tous les autres outils dont vous avez besoin pour gérer cet événement.

Relier les événements

Notez que le simple fait de créer un événement et son gestionnaire n’informe pas le bus qu’ils doivent être associés. Vous devez lier la relation d’écoute dans app\Providers\EventServiceProvidersur son $listen propriété:

// app\Providers\EventServiceProvider
    $listen = [
        ThingWasDone::class => [
            SendMailInSomeParticularContext::class,
            SaveSomeRecordInSomeOtherContext::class,
            DoSomethingElseInResponseToThingBeingDone::class
        ]
    ];

Comme vous pouvez le voir, vous utilisez ::class pour obtenir une représentation sous forme de chaîne du nom de classe de cet événement, puis vous ajoutez des écouteurs (en utilisant ::class aussi).

Prêt, visez, ::fire

OK, il est donc enfin temps de déclencher l’événement. Notez qu’il ne s’agit que de simples classes PHP – vous pouvez instancier manuellement un événement, instancier son gestionnaire et transmettre l’événement à la méthode du gestionnaire. Mais le bus fourni par Laravel le rend plus facile, plus cohérent, et plus global :

\Event::fire(new ThingWasDone($param1, $param2));

C’est ça!

Devrait être mis en file d’attente

Tout comme avec les commandes, vous pouvez faire en sorte que votre événement implémente le Illuminate\Contracts\Queue\ShouldBeQueued interface, et cela fera remonter la gestion de l’événement dans la file d’attente ; et vous pouvez ajouter le Illuminate\Queue\InteractsWithQueue trait pour donner un accès facile aux méthodes de gestion des interactions avec la file d’attente, comme la suppression du travail en cours.

Trait SerializesModels

Notez que, comme dans les commandes, si vous souhaitez attacher un modèle Eloquent à un événement, vous devez inclure le SerializesModels trait en haut de la définition de classe pour cet événement. Au moment d’écrire ces lignes, il est en fait déjà inclus par défaut.

Conclusion

C’est ça! Une fois que vous avez compris les commandes et les gestionnaires de Laravel 5, les événements sont simples : le système de déclenchement est délation le monde environnant que quelque chose s’est passé, plutôt que exigeant que le monde environnant fasse quelque chose. Mais ce sont tous les deux des moyens d’encapsuler l’intention d’un message, et ils peuvent aussi très bien jouer ensemble.