Skip to main content

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 come SoftDeletes, HasUuids e HasUlids.

boot vs. initialize


Convenzioni di denominazione

bootXxx()

Definisci un metodo static con prefisso boot seguito dal nome della classe del trait. Eloquent lo invoca una sola volta per ciclo di vita della classe.
Utilizzo del trait in un modello:

initializeXxx()

Definisci un metodo di istanza con prefisso initialize seguito dal nome della classe del trait. Eloquent lo invoca ogni volta che viene creata una nuova istanza.
Anche l’unione dinamica dei cast è un uso comune:

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.
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.
Ultima modifica il 15 luglio 2026