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\EventServiceProvider
sur 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.