Skip to main content

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.
Se il nome del metodo è incluso in $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.
In pratica $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.
Per aggiungere metodi personalizzati usa 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.
Se stai “estraendo la stessa proprietà da ogni elemento” o “chiamando lo stesso metodo su ogni elemento”, gli higher-order messages sono più leggibili. Se la condizione è complessa o gli argomenti sono dinamici, usa una closure.

Usare gli higher-order messages in classi personalizzate

Per sfruttare il meccanismo di HigherOrderCollectionProxy 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.
Ultima modifica il 13 luglio 2026