Skip to main content

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

Utilisez make:event et make:listener.
Sans arguments, la commande est interactive.

Enregistrement des listeners

Auto-discovery

Par défaut, Laravel scanne app/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é.
Un type union PHP permet de gérer plusieurs événements dans la même méthode.
Pour des listeners hors de ce dossier, ajoutez des chemins de scan dans bootstrap/app.php.
Wildcards autorisés :
Liste des listeners enregistrés :
En production, mettez le manifest en cache : php artisan optimize ou php artisan event:cache. Videz-le avec php artisan event:clear.

Enregistrement manuel

Via Event dans AppServiceProvider::boot.
Ou via closure.

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.
Le trait 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 statique dispatch ou le helper event().
Il existe aussi les variantes conditionnelles.

Après la commit d’une transaction

Pour ne dispatcher qu’après commit d’une transaction, implémentez ShouldDispatchAfterCommit. En cas de rollback, l’événement est ignoré.

Implémenter un listener

La méthode handle reçoit l’événement. Le constructeur peut recevoir des dépendances via le conteneur.
Retourner 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émentez ShouldQueue : 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’attribut DebounceFor à un listener en file d’attente, vous pouvez regrouper les événements sur une période donnée.
Dans cet exemple, si des événements 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.
Vous pouvez changer le store de cache utilisé pour suivre le debounce via la méthode debounceVia, qui reçoit l’événement.
Les listeners debouncés et les listeners uniques ne sont pas combinables. N’implémentez pas 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.
Ou via des méthodes dynamiques.

Nombre max d’essais et timeout

Gestion des échecs

La méthode failed 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, dans AppServiceProvider::boot, appelez Event::subscribe.

Exemple : e-mail de bienvenue à l’inscription

1

Créer l'événement

Ajoutez une propriété pour l’utilisateur.
2

Créer le listener

Implémentez 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.
Avec l’auto-discovery, aucun enregistrement manuel n’est requis dans AppServiceProvider.
Vérifiez régulièrement php artisan event:list pour détecter d’éventuels listeners inattendus.
Dernière modification le 21 août 2026