Skip to main content

Wat zijn events?

Het eventsysteem van Laravel is een eenvoudige implementatie van het observer-patroon. Door gebeurtenissen (events) die in je applicatie plaatsvinden af te vuren en listeners te definiëren die erop reageren, houd je de afhankelijkheden tussen componenten minimaal. Als je bijvoorbeeld het event “bestelling bevestigd” afvuurt, gaan meerdere listeners onafhankelijk van elkaar aan de slag: “bevestigingsmail sturen”, “voorraad verlagen”, “notificatie naar Slack sturen”. De code voor het verwerken van de bestelling hoeft niets te weten van de implementatie van het versturen van mails of Slack-notificaties.
Eventklassen plaats je in de map app/Events, listenerklassen in de map app/Listeners. Als een van beide mappen niet bestaat, maakt het Artisan-commando ze automatisch aan.

Events en listeners genereren

Met de Artisan-commando’s make:event en make:listener genereer je klassjablonen.
Voer je ze zonder argumenten uit, dan wordt er interactief om invoer gevraagd.

Events registreren

Event discovery (automatische detectie)

Standaard scant Laravel de map app/Listeners en registreert het listeners automatisch. De mapping met events wordt afgeleid uit het argumenttype van methoden met de naam handle of __invoke.
Met PHP-uniontypen kun je meerdere events in één methode ontvangen.
Plaats je listeners in een andere map, geef dan extra scanlocaties op in bootstrap/app.php.
Met wildcards kun je meerdere mappen in één keer opgeven.
Met het volgende commando bekijk je de lijst met geregistreerde listeners.
In productie verbeter je de prestaties door het listener-manifest te cachen. Voer bij het deployen php artisan optimize of php artisan event:cache uit. Gebruik php artisan event:clear om de cache te verwijderen.

Handmatige registratie

Je kunt listeners ook handmatig registreren met de Event-facade in de boot-methode van je AppServiceProvider.
Registreren met een closure is ook mogelijk.

Events definiëren

Een eventklasse is een datacontainer. Hij bevat geen logica, maar bewaart de informatie die bij het event hoort als properties.
Dankzij de SerializesModels-trait worden Eloquent-modellen correct behandeld wanneer gequeuede listeners het event serialiseren.

Events afvuren

Vuur events af met de statische dispatch-methode of de event()-helper.
Er zijn ook methoden om voorwaardelijk af te vuren.

Afvuren na een databasetransactie

Wil je een event pas afvuren nadat een transactie is gecommit, implementeer dan de interface ShouldDispatchAfterCommit op de eventklasse. Als de transactie mislukt, wordt het event weggegooid.

Listeners implementeren

Een listener ontvangt het event in de handle-methode. In de constructor injecteert de servicecontainer automatisch de afhankelijkheden.
Als de handle-methode van een listener false teruggeeft, wordt de doorgifte van het event aan volgende listeners gestopt.

Gequeuede listeners

Tijdrovende taken zoals het versturen van e-mail of HTTP-requests kun je asynchroon uitvoeren als gequeuede listeners. Door simpelweg de ShouldQueue-interface te implementeren, wordt de listener bij het afvuren van het event automatisch op de queue geplaatst.
Voordat je gequeuede listeners gebruikt, moet je de queue configureren en een worker starten. Zie de pagina Queues en jobs voor details.

Event-listeners debouncen

Wanneer hetzelfde soort event in korte tijd meerdere keren wordt afgevuurd, wil je soms alleen het laatste event verwerken. Door het DebounceFor-attribuut aan een gequeuede listener toe te voegen, kun je events binnen de opgegeven periode bundelen.
In dit voorbeeld wordt, wanneer het ProductUpdated-event van hetzelfde product binnen 30 seconden herhaaldelijk wordt afgevuurd, de listener gedebounced en alleen het laatste event verwerkt. Events met een verschillende debounceId worden elk afzonderlijk verwerkt. Om een bovengrens te stellen aan de tijd dat vaak afgevuurde events de listener kunnen blijven uitstellen, geef je maxWait op.
De cachestore die voor het bijhouden van het debouncen wordt gebruikt, kun je wijzigen met de debounceVia-methode die het event ontvangt.
Gedebouncede listeners en unieke listeners kunnen niet samen worden gebruikt. Implementeer geen ShouldBeUnique op listeners die het DebounceFor-attribuut gebruiken. Als je events afvuurt vanaf meerdere webservers of containers, configureer dan alle servers zo dat ze dezelfde gedeelde cacheserver gebruiken.

De queueverbinding, -naam en vertraging aanpassen

Met PHP-attributen kun je de verbinding, queuenaam en vertragingstijd instellen.
Je kunt de waarden ook dynamisch bepalen met methoden.

Maximaal aantal pogingen en time-out

Met de attributen #[Tries] en #[Timeout] beheers je het gedrag bij falen.

Afhandeling bij falen

Als je een failed-methode definieert, kun je nazorg beschrijven voor wanneer de listener het maximale aantal pogingen heeft overschreden.

Eventsubscribers

Met eventsubscribers bundel je meerdere gerelateerde eventhandlers in één klasse.

Een subscriber schrijven

In de subscribe-methode geef je de mapping van events naar handlers terug als array.

Subscribers registreren

Als event discovery ingeschakeld is, worden subscribers die een array teruggeven vanuit de subscribe-methode automatisch geregistreerd. Wil je handmatig registreren, roep dan Event::subscribe aan in de boot-methode van je AppServiceProvider.

Praktijkvoorbeeld: een welkomstmail sturen bij gebruikersregistratie

1

Maak de eventklasse aan

Bewerk app/Events/UserRegistered.php en voeg een property toe die de geregistreerde gebruiker bewaart.
2

Maak de listenerklasse aan

Implementeer ShouldQueue om het versturen van de mail asynchroon via de queue te doen.
3

Vuur het event af in de controller

Roep na de gebruikersregistratie UserRegistered::dispatch() aan.
De RegisterController vuurt alleen het UserRegistered-event af en weet niets van de implementatie van het versturen van de mail. Als er later “bij registratie ook een Slack-notificatie sturen” bij komt, hoeft er niets aan de controller te veranderen.
4

Start een worker

Start een worker om de gequeuede listeners te verwerken.
Als event discovery ingeschakeld is, is handmatige registratie in de AppServiceProvider niet nodig. Listeners in de map app/Listeners worden automatisch gedetecteerd.
Met php artisan event:list bekijk je de lijst met geregistreerde events en listeners. Controleer regelmatig of er geen onverwachte listeners geregistreerd zijn.
Laatst gewijzigd op 6 september 2026