Qu’est-ce qu’un événement
Le système d’événements de Laravel implémente le pattern observateur. Vous déclenchez des « événements » représentant des faits survenus dans l’application, et des listeners y réagissent, ce qui minimise les dépendances entre composants. Par exemple, un événement « commande validée » peut déclencher indépendamment « envoyer l’e-mail de confirmation », « décrémenter le stock » et « notifier Slack ». Le code de la commande ignore complètement l’implémentation de l’envoi de mails ou de Slack.Les classes d’événement vont dans
app/Events, les listeners dans app/Listeners.
Ces dossiers sont créés automatiquement par les commandes Artisan.Générer événements et listeners
Utilisezmake:event et make:listener.
Enregistrement des listeners
Auto-discovery
Par défaut, Laravel scanneapp/Listeners et enregistre les listeners.
La classe/méthode handle ou __invoke est inspectée : le type de son argument détermine l’événement écouté.
bootstrap/app.php.
Enregistrement manuel
ViaEvent dans AppServiceProvider::boot.
Définir un événement
Une classe d’événement n’est qu’un conteneur de données. Elle porte les informations liées à l’événement, sans logique.SerializesModels garantit une bonne sérialisation des modèles Eloquent quand le listener est en file.
Déclencher un événement
Utilisez la méthode statiquedispatch ou le helper event().
Après la commit d’une transaction
Pour ne dispatcher qu’après commit d’une transaction, implémentezShouldDispatchAfterCommit. En cas de rollback, l’événement est ignoré.
Implémenter un listener
La méthodehandle reçoit l’événement.
Le constructeur peut recevoir des dépendances via le conteneur.
false depuis handle interrompt la propagation aux listeners suivants.
Listeners en file (queued)
Pour les traitements longs (mail, HTTP…), exécutez le listener en asynchrone. ImplémentezShouldQueue : Laravel enfile automatiquement le listener lors du dispatch.
Nécessite la configuration de la queue et le démarrage d’un worker. Voir Queues et jobs.
Debounce des listeners
Lorsqu’un même événement est déclenché de nombreuses fois dans un court intervalle, il peut être souhaitable de ne traiter que le dernier événement. En ajoutant l’attributDebounceFor à un listener en file d’attente, vous pouvez regrouper les événements sur une période donnée.
ProductUpdated sont émis à répétition sur un même produit pendant 30 secondes, le listener est « debounced » et seul le dernier événement est traité. Les événements avec un debounceId différent sont traités indépendamment.
Pour limiter la durée maximale pendant laquelle des événements très fréquents peuvent différer l’exécution du listener, précisez maxWait.
debounceVia, qui reçoit l’événement.
ShouldBeUnique sur un listener qui utilise l’attribut DebounceFor. Lorsque les événements sont déclenchés depuis plusieurs serveurs web ou conteneurs, configurez tous les serveurs pour utiliser le même serveur de cache partagé.
Personnaliser connexion, queue et délai
Utilisez les attributs PHP.Nombre max d’essais et timeout
Gestion des échecs
La méthodefailed est appelée après épuisement des tentatives.
Souscripteurs d’événements
Un souscripteur regroupe plusieurs handlers dans une même classe.Créer un souscripteur
subscribe renvoie la table événement → handler.
Enregistrement
Avec l’auto-discovery, les souscripteurs retournant un tableau sont enregistrés automatiquement. Sinon, dansAppServiceProvider::boot, appelez Event::subscribe.
Exemple : e-mail de bienvenue à l’inscription
1
Créer l'événement
2
Créer le listener
ShouldQueue pour un envoi asynchrone.3
Dispatcher l'événement depuis le contrôleur
Après la création de l’utilisateur.
RegisterController ignore l’implémentation de l’envoi de mail.
Ajouter plus tard un « notifier Slack » ne modifie pas le contrôleur.4
Démarrer un worker
Pour traiter les listeners en file.