Overzicht
Een Eloquent-model voert bij elke instantiatie een “opstartproces (boot)” en een “initialisatieproces (initialize)” uit. Definieer je deze methodes in een trait, dan worden ze automatisch aangeroepen zodra een model die traituse-t.
Met dit mechanisme kun je traits die functionaliteit in een model injecteren netjes implementeren. Het Laravel-framework zelf gebruikt dit patroon ook in veel traits, zoals SoftDeletes.
Het verschil tussen boot en initialize
Naamgevingsconventie
bootXxx()
Definieer je eenstatic-methode met de prefix boot gevolgd door de traitnaam, dan wordt die één keer aangeroepen bij het opstarten van het model.
initializeXxx()
Definieer je een instantiemethode met de prefixinitialize gevolgd door de traitnaam, dan wordt die aangeroepen bij elke new van het model.
$casts:
Expliciete aanduiding via PHP-attributes
Vanaf Laravel 12 kun je methodes expliciet aanwijzen met PHP-attributes, zonder afhankelijk te zijn van de naamgevingsconventie.Met PHP-attributes is de methodenaam niet gebonden aan de traitnaam, zodat je betekenisvolle namen kunt kiezen. Je kunt ook meerdere
#[Boot]- of #[Initialize]-methodes in dezelfde trait definiëren.Praktijkvoorbeelden: toepassing in packageontwikkeling
Automatisch een globale scope toevoegen
Standaardcasts toevoegen
Automatische verwerking via Eloquent-events
Voorbeelden binnen het Laravel-framework
Het Laravel-framework zelf past dit patroon toe in veel traits.
Lees deze als referentie-implementaties om het patroon beter te begrijpen.
Aandachtspunten
De modelcache legen
Omdatboot* per klasse maar één keer wordt uitgevoerd, moet je opletten in de testomgeving. Met Model::clearBootedModels() reset je de cache van geboote modellen.
Uitvoeringsvolgorde
use-t hetzelfde model meerdere traits, dan worden bootXxx() / initializeXxx() aangeroepen in de traitresolutievolgorde van PHP (declaratievolgorde). Let bij afhankelijkheden dus op de volgorde van de use-statements.
Samenvatting
Implementeer je
bootXxx() / initializeXxx() in een trait, dan is het injecteren van functionaliteit in een model geregeld met één regel use. Hét standaardpatroon om vanuit een package functionaliteit aan modellen toe te voegen.