Skip to main content

Cos’è il trait Macroable

Il trait Macroable permette di aggiungere dinamicamente metodi a una classe, senza modificarla. Molte delle classi core di Laravel usano questo trait, quindi puoi estenderne le funzionalità senza toccare il codice del core. Il trait vero e proprio si trova in Illuminate\Support\Traits\Macroable. Internamente memorizza le macro registrate nella proprietà statica $macros e le richiama tramite le magic method __call / __callStatic.

Classi che usano Macroable

In Laravel ci sono molte classi che supportano Macroable.

macro() — aggiungere un metodo

A macro() passi come primo argomento il nome del metodo e come secondo argomento una closure.
Il $this all’interno della closure viene collegato all’istanza che ha invocato la macro. In questo modo puoi accedere direttamente a proprietà e metodi della classe.

mixin() — aggiungere più metodi in blocco

Per registrare tante macro insieme usa mixin(). Tutti i metodi public / protected della classe mixin vengono registrati come macro.
I metodi del mixin() devono restituire la closure da registrare come macro. Il valore restituito dal metodo diventa l’implementazione della macro.

Registrazione nel service provider

Le macro devono essere registrate all’avvio dell’applicazione. Il metodo boot() di AppServiceProvider è il posto giusto.

Casi d’uso pratici

Estendere Collection

L’aggiunta di metodi personalizzati alle collection è l’uso più comune.

Estendere la classe Str

Estendere la classe Request

Estendere Blueprint (migrazioni)

Se raggruppi in macro le definizioni delle colonne, mantieni un design del DB uniforme.

Estendere le test response

Puoi aggiungere metodi di assertion specifici per i test.

hasMacro() — verificare l’esistenza di una macro

flushMacros() — resettare le macro

Utile quando vuoi resettare le macro nei test.
flushMacros() rimuove tutte le macro della classe. Talvolta viene chiamato in tearDown() per garantire l’indipendenza tra i test, ma attenzione: cancella anche macro registrate da altri test.

Macro statiche

Le macro funzionano non solo come metodi d’istanza ma anche come metodi statici. Sono gestite da __callStatic.

Usare Macroable nelle tue classi

Puoi integrare Macroable anche in classi che scrivi tu.

Dettagli dell’implementazione interna

La closure viene collegata all’istanza con Closure::bindTo(). In questo modo $this fa riferimento all’oggetto che ha chiamato la macro. Per elementi non closure (ad esempio oggetti invokable) il bind non viene eseguito.
Per ottenere supporto dall’IDE puoi definire le annotazioni delle macro con un Docblock che usa @mixin, oppure generare automaticamente un file helper con il pacchetto Laravel IdeHelper.

Prossimi passi

Pattern Pipeline

Impara a comporre in serie più step di elaborazione con il pattern pipeline.
Ultima modifica il 13 luglio 2026