Skip to main content

Wat zijn modelevents?

Een Eloquent-model vuurt automatisch events af op verschillende momenten in zijn levenscyclus. Door op deze events in te haken kun je verwerking toevoegen vóór en na het opslaan, verwijderen, enzovoort. De events die Eloquent afvuurt: Events die eindigen op -ing gaan af vóórdat de wijziging in de DB wordt vastgelegd; events die eindigen op -ed gaan daarna af.
Bij mass updates en mass deletes (zoals User::where(...)->update(...)) worden de events saving, saved, updating, updated, deleting en deleted niet afgevuurd, omdat de modellen niet daadwerkelijk worden opgehaald.

Eventlisteners met closures

Wil je events simpel afhandelen, dan kun je closures registreren in de booted-methode van het model.
Wil je de verwerking asynchroon via een queue uitvoeren, gebruik dan de queueable-helper.

De property $dispatchesEvents

Wil je integreren met het eventsysteem van Laravel, dan map je modelevents met de property $dispatchesEvents naar eigen eventklassen.
De gemapte eventklasse ontvangt de modelinstantie in zijn constructor.

Een observerklasse maken

Verwerk je meerdere events voor één model, dan is een observerklasse overzichtelijker dan een reeks closures.
1

De klasse genereren met een Artisan-commando

Genereer een sjabloon met het commando make:observer. Geef je met de optie --model het model op, dan worden de bijbehorende methodes automatisch toegevoegd.
Er wordt een app/Observers/UserObserver.php gegenereerd.
2

De methodes voor de events implementeren

De methodenaam komt overeen met de eventnaam. Als argument wordt de modelinstantie doorgegeven.
3

De observer registreren bij het model

Er zijn twee manieren om te registreren. In Laravel 13 heeft het #[ObservedBy]-attribute de voorkeur.Manier 1: het #[ObservedBy]-attribute (aanbevolen)Alleen het attribute op de modelklasse zetten is genoeg; je hoeft de AppServiceProvider niet aan te passen.
Wil je meerdere observers registreren, herhaal dan het attribute of geef een array door.
Manier 2: registreren in de AppServiceProviderRoep observe aan in de boot-methode van de AppServiceProvider.
Het #[ObservedBy]-attribute staat in de namespace Illuminate\Database\Eloquent\Attributes. Het is native syntaxis van PHP 8.0 en later en wordt in Laravel 13 actief toegepast.

Observers binnen databasetransacties

Wordt een model binnen een transactie aangemaakt of bijgewerkt, dan wil je de observer soms pas na de commit van de transactie laten draaien. Implementeer daarvoor de interface ShouldHandleEventsAfterCommit.
Gebeurt de uitvoering buiten een transactie, dan wordt de observer zoals gebruikelijk direct uitgevoerd.

Events tijdelijk uitschakelen

Alleen voor een specifieke bewerking events stoppen met withoutEvents

Binnen de closure die je doorgeeft aan User::withoutEvents() worden geen enkele modelevents afgevuurd.

Events bij het opslaan stoppen met saveQuietly

Wil je een model opslaan zonder events af te vuren, gebruik dan saveQuietly.
Vergelijkbare methodes bestaan ook voor verwijderen, herstellen en repliceren.

Praktische use cases

Automatisch de cache legen

Automatisch de gerelateerde cache legen wanneer een model wordt bijgewerkt of verwijderd.

Auditlogs bijhouden

De wijzigingsgeschiedenis van een model automatisch vastleggen. Met getDirty() haal je de gewijzigde waarden op.
Het updating-event gaat af vóór het opslaan in de DB, dus met getDirty() haal je de nog door te voeren waarden op. Roep je het aan na het updated-event, dan is getDirty() leeg.

Gerelateerde modellen automatisch bijwerken

Een voorbeeld dat automatisch de voorraad bijwerkt wanneer een bestelling is geplaatst.

Volgende stap

Geavanceerd: PHP-attributes

Leer de PHP-attributes van Laravel 13 kennen, inclusief #[ObservedBy].
Laatst gewijzigd op 6 september 2026