Cos’è il trait Macroable
Il traitMacroable 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
Amacro() passi come primo argomento il nome del metodo e come secondo argomento una closure.
$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 usamixin(). 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 metodoboot() 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.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 integrareMacroable anche in classi che scrivi tu.
Dettagli dell’implementazione interna
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.
Prossimi passi
Pattern Pipeline
Impara a comporre in serie più step di elaborazione con il pattern pipeline.