Skip to main content

Überblick

Jedes Mal, wenn ein Eloquent-Modell instanziiert wird, durchläuft es zwei Phasen: boot (einmal pro Klasse) und initialize (einmal pro Instanz). Wenn Sie bestimmte Methoden in einem Trait definieren, erkennt Eloquent diese automatisch und ruft sie auf. Es genügt, den Trait dem Modell hinzuzufügen. Laravel selbst nutzt dieses Muster ausgiebig in Traits wie SoftDeletes, HasUuids und HasUlids.

boot vs. initialize


Namenskonventionen

bootXxx()

Definieren Sie eine static Methode mit dem Präfix boot, gefolgt vom Klassenbasisnamen des Traits. Eloquent ruft sie einmal pro Klassen-Lebenszyklus auf.
Verwendung des Traits in einem Modell:

initializeXxx()

Definieren Sie eine Instanzmethode mit dem Präfix initialize, gefolgt vom Klassenbasisnamen des Traits. Eloquent ruft sie bei jeder Erstellung einer neuen Instanz auf.
Das dynamische Zusammenführen von Casts ist ein weiterer häufiger Anwendungsfall:

PHP Attributes

Seit Laravel 12 können Sie anstelle von Namenskonventionen PHP Attributes verwenden.
Durch die Verwendung von PHP Attributes werden Ihre Methodennamen von der Einschränkung des Trait-Namens befreit. Sie können außerdem mehrere #[Boot]- oder #[Initialize]-Methoden innerhalb desselben Traits definieren.

Praktische Beispiele

Globalen Scope automatisch hinzufügen

Standard-Casts zusammenführen

Automatisches Archivieren beim Löschen


Beispiele aus dem Framework

Die eigenen Traits von Laravel veranschaulichen das Muster deutlich: Diese Implementierungen zu lesen ist ein guter Weg, das Muster tiefergehend zu verstehen.

Hinweise

Booted Models in Tests zurücksetzen

Da boot* nur einmal pro Klasse ausgeführt wird, müssen Tests, die das Modellverhalten ändern, gegebenenfalls den Boot-Cache zurücksetzen:

Ausführungsreihenfolge

Wenn ein Modell mehrere Traits verwendet, werden bootXxx() und initializeXxx() in der PHP-Trait-Auflösungsreihenfolge (Deklarationsreihenfolge) aufgerufen. Achten Sie auf die Reihenfolge, wenn Traits voneinander abhängen.

Zusammenfassung

Wenn Sie bootXxx() und initializeXxx() in einem Trait implementieren, können Sie mit einer einzigen use-Anweisung Verhalten in jedes Eloquent-Modell einfügen – das bevorzugte Muster für Paketautoren.
Zuletzt geändert am 15. Juli 2026