Panoramica
Ogni volta che un modello Eloquent viene istanziato esegue due fasi: boot (una volta per classe) e initialize (una volta per istanza). Quando definisci metodi specifici in un trait, Eloquent li rileva e li invoca automaticamente. È sufficiente aggiungere il trait al modello. Laravel stesso utilizza questo pattern in modo estensivo in trait comeSoftDeletes, HasUuids e HasUlids.
boot vs. initialize
Convenzioni di denominazione
bootXxx()
Definisci un metodostatic con prefisso boot seguito dal nome della classe del trait. Eloquent lo invoca una sola volta per ciclo di vita della classe.
initializeXxx()
Definisci un metodo di istanza con prefissoinitialize seguito dal nome della classe del trait. Eloquent lo invoca ogni volta che viene creata una nuova istanza.
Attribute PHP
A partire da Laravel 12, puoi utilizzare gli Attribute PHP invece di affidarti alle convenzioni di denominazione.L’uso degli Attribute PHP libera i nomi dei metodi dal vincolo del nome del trait. Puoi anche definire più metodi
#[Boot] o #[Initialize] all’interno dello stesso trait.Esempi pratici
Aggiunta automatica di un global scope
Unione di cast di default
Archiviazione automatica alla cancellazione
Esempi nel framework
I trait di Laravel dimostrano chiaramente il pattern:
Leggere queste implementazioni è un ottimo modo per comprendere il pattern in profondità.
Avvertenze
Pulire i modelli bootati nei test
Poichéboot* viene eseguito una sola volta per classe, i test che modificano il comportamento del modello potrebbero dover reimpostare la cache di boot:
Ordine di esecuzione
Quando un modello usa più trait,bootXxx() e initializeXxx() vengono chiamati nell’ordine di risoluzione dei trait di PHP (ordine di dichiarazione). Fai attenzione all’ordine quando i trait dipendono l’uno dall’altro.
Riepilogo
Implementare
bootXxx() e initializeXxx() in un trait ti permette di iniettare comportamenti in qualsiasi modello Eloquent con una singola istruzione use — il pattern di riferimento per gli autori di package.