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’smake:event en make:listener genereer je klassjablonen.
Events registreren
Event discovery (automatische detectie)
Standaard scant Laravel de mapapp/Listeners en registreert het listeners automatisch.
De mapping met events wordt afgeleid uit het argumenttype van methoden met de naam handle of __invoke.
bootstrap/app.php.
Handmatige registratie
Je kunt listeners ook handmatig registreren met deEvent-facade in de boot-methode van je AppServiceProvider.
Events definiëren
Een eventklasse is een datacontainer. Hij bevat geen logica, maar bewaart de informatie die bij het event hoort als properties.SerializesModels-trait worden Eloquent-modellen correct behandeld wanneer gequeuede listeners het event serialiseren.
Events afvuren
Vuur events af met de statischedispatch-methode of de event()-helper.
Afvuren na een databasetransactie
Wil je een event pas afvuren nadat een transactie is gecommit, implementeer dan de interfaceShouldDispatchAfterCommit op de eventklasse.
Als de transactie mislukt, wordt het event weggegooid.
Listeners implementeren
Een listener ontvangt het event in dehandle-methode.
In de constructor injecteert de servicecontainer automatisch de afhankelijkheden.
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 deShouldQueue-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 hetDebounceFor-attribuut aan een gequeuede listener toe te voegen, kun je events binnen de opgegeven periode bundelen.
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.
debounceVia-methode die het event ontvangt.
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.Maximaal aantal pogingen en time-out
Met de attributen#[Tries] en #[Timeout] beheers je het gedrag bij falen.
Afhandeling bij falen
Als je eenfailed-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 desubscribe-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 desubscribe-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
app/Events/UserRegistered.php en voeg een property toe die de geregistreerde gebruiker bewaart.2
Maak de listenerklasse aan
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 De
UserRegistered::dispatch() aan.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.