Cosa sono gli higher-order messages
Gli higher-order messages sono una sintassi che permette di chiamare i metodi di una collection nella forma di un accesso a proprietà. Senza scrivere callback, puoi invocare un metodo su ogni elemento o ottenerne una proprietà.$users->map->name significa “estrai la proprietà name di ogni utente e applica map”.
Meccanismo — HigherOrderCollectionProxy
Accedendo come proprietà con$collection->map, viene invocato __get() del trait EnumeratesValues.
$proxies, viene restituita un’istanza di HigherOrderCollectionProxy. Questo proxy conserva due elementi: la collection e il nome del metodo.
Proxy di accesso a proprietà con __get
Accedendo poi a una proprietà (->name), viene invocato __get() del proxy.
$users->map->name è equivalente a:
Proxy di chiamata a metodo con __call
Chiamando poi un metodo (->activate()), viene invocato __call() del proxy.
$users->each->activate() è equivalente a:
Elenco dei metodi supportati
I metodi utilizzabili come higher-order messages sono definiti nell’array$proxies.
Collection::proxy().
Casi d’uso pratici
Collection di modelli Eloquent
Gli higher-order messages sono particolarmente comodi con le collection Eloquent.Filtraggio
Aggregazioni
Raggruppamento e ordinamento
Appiattire l’annidamento con flatMap
Verifiche condizionali
Collection di stringhe
Funziona anche con collection di stringhe.__call() del proxy, in caso di stringa, invoca il metodo come statico.
Perché gli higher-order messages funzionino con collection di stringhe, il metodo deve essere definito staticamente sul tipo stringa. Di solito sono più naturali con collection di modelli Eloquent o classi personalizzate.
Confronto con le normali closure
Gli higher-order messages sono concisi, ma non applicabili in ogni caso.Usare gli higher-order messages in classi personalizzate
Per sfruttare il meccanismo diHigherOrderCollectionProxy tramite il trait EnumeratesValues, chiami Collection::proxy() per aggiungere il metodo tra quelli proxificabili.
Prossimi passi
Trait Conditionable
Impara l’implementazione interna di
when() / unless() e come applicarlo al QueryBuilder e alle tue classi.