Skip to main content

Was sind Modell-Events?

Eloquent-Modelle lösen an bestimmten Punkten ihres Lebenszyklus automatisch Events aus. Indem Sie sich an diese Events hängen, können Sie vor oder nach dem Speichern, Löschen usw. eigene Logik einschleusen. Die von Eloquent ausgelösten Events sind: Events, die auf -ing enden, feuern vor der Persistierung in die DB, Events auf -ed danach.
Bei Massen-Updates oder Massen-Deletes (z. B. User::where(...)->update(...)) werden die Events saving, saved, updating, updated, deleting, deleted nicht ausgelöst, weil die Modelle nicht instanziiert werden.

Event-Listener über Closures

Für einfache Event-Behandlung können Sie Closures in der booted-Methode des Modells registrieren.
Um die Verarbeitung asynchron in einer Queue auszuführen, verwenden Sie den Helper queueable.

Property $dispatchesEvents

Wenn Sie das Laravel-Event-System nutzen möchten, ordnen Sie über die Property $dispatchesEvents Modell-Events eigenen Event-Klassen zu.
Die zugeordneten Event-Klassen erhalten die Modell-Instanz per Konstruktor.

Eine Observer-Klasse anlegen

Wenn Sie mehrere Events desselben Modells bündeln möchten, ist eine Observer-Klasse übersichtlicher als eine Reihe von Closures.
1

Klasse per Artisan-Command erzeugen

Erzeugen Sie ein Gerüst mit make:observer. Mit der Option --model erhalten Sie passende Methoden.
Die Datei app/Observers/UserObserver.php wird angelegt.
2

Methoden je Event implementieren

Der Methodenname entspricht dem Event-Namen. Als Argument erhalten Sie die Modell-Instanz.
3

Observer am Modell registrieren

Es gibt zwei Registrierungsvarianten. In Laravel 13 wird das Attribut #[ObservedBy] empfohlen.Variante 1: Attribut #[ObservedBy] (empfohlen)Sie versehen die Modellklasse mit dem Attribut — die Registrierung ist damit abgeschlossen. Änderungen am AppServiceProvider sind nicht nötig.
Zum Registrieren mehrerer Observer wiederholen Sie das Attribut oder übergeben ein Array.
Variante 2: Registrierung im AppServiceProviderRufen Sie in der boot-Methode observe auf.
Das Attribut #[ObservedBy] liegt im Namensraum Illuminate\Database\Eloquent\Attributes und ist native PHP-Syntax ab 8.0, die Laravel 13 aktiv einsetzt.

Observer innerhalb von Datenbanktransaktionen

Werden Modelle innerhalb einer Transaktion erstellt oder aktualisiert, wollen Sie den Observer manchmal erst nach dem Commit ausführen. Implementieren Sie dazu das Interface ShouldHandleEventsAfterCommit.
Wird außerhalb einer Transaktion gearbeitet, läuft der Observer wie gewohnt sofort.

Events temporär deaktivieren

withoutEvents — Events während eines Codeabschnitts unterdrücken

Innerhalb der an User::withoutEvents() übergebenen Closure werden keinerlei Modell-Events ausgelöst.

saveQuietly — Events beim Speichern unterdrücken

Wenn Sie ein Modell speichern wollen, ohne Events auszulösen, nutzen Sie saveQuietly.
Analog gibt es Methoden für Löschen, Wiederherstellen und Replizieren.

Praktische Anwendungsfälle

Cache automatisch invalidieren

Wenn ein Modell aktualisiert oder gelöscht wird, den zugehörigen Cache automatisch leeren.

Audit-Logs schreiben

Änderungshistorien automatisch protokollieren. Mit getDirty() erhalten Sie die Werte vor und nach der Änderung.
Das Event updating feuert vor der Persistierung in die DB — hier liefert getDirty() die geplanten neuen Werte. Nach dem Event updated ist getDirty() bereits leer.

Verknüpfte Modelle automatisch aktualisieren

Beispiel: Nach Abschluss einer Bestellung den Lagerbestand automatisch anpassen.

Nächste Schritte

Fortgeschritten: PHP-Attribute

Lernen Sie die PHP-Attribute von Laravel 13 inklusive #[ObservedBy] im Überblick.
Zuletzt geändert am 13. Juli 2026