Ü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 wieSoftDeletes, HasUuids und HasUlids.
boot vs. initialize
Namenskonventionen
bootXxx()
Definieren Sie einestatic Methode mit dem Präfix boot, gefolgt vom Klassenbasisnamen des Traits. Eloquent ruft sie einmal pro Klassen-Lebenszyklus auf.
initializeXxx()
Definieren Sie eine Instanzmethode mit dem Präfixinitialize, gefolgt vom Klassenbasisnamen des Traits. Eloquent ruft sie bei jeder Erstellung einer neuen Instanz auf.
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
Daboot* 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, werdenbootXxx() 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.