Qué son los mensajes de orden superior
Los mensajes de orden superior (Higher-order Messages) son una sintaxis para invocar métodos de una colección accediendo a ellos como si fueran propiedades. Sin escribir una callback, puedes llamar a un método o acceder a una propiedad de cada elemento.$users->map->name significa «extrae la propiedad name de cada usuario y aplica map».
Cómo funciona — HigherOrderCollectionProxy
Cuando accedes a algo como$collection->map como si fuera una propiedad, se invoca __get() del trait EnumeratesValues.
$proxies, se devuelve una instancia de HigherOrderCollectionProxy. Este proxy conserva la colección y el nombre del método.
Proxy de acceso a propiedad mediante __get
Si a continuación accedes a una propiedad (->name), se invoca el __get() del proxy.
$users->map->name equivale a:
Proxy de llamada a método mediante __call
Si en su lugar llamas a un método (->activate()), se invoca el __call() del proxy.
$users->each->activate() equivale a:
Lista de métodos compatibles
Los métodos disponibles como mensajes de orden superior se declaran en el array$proxies.
Collection::proxy().
Casos de uso prácticos
Colecciones de modelos Eloquent
Los mensajes de orden superior son especialmente útiles con colecciones de Eloquent.Filtrado
Agregaciones
Agrupación y ordenación
Aplanar con flatMap
Comprobaciones condicionales
Colecciones de cadenas
También se pueden usar en colecciones de cadenas. El__call() del proxy trata las cadenas como si fueran una llamada estática.
Para usar mensajes de orden superior con una colección de cadenas, el método debe existir estáticamente en el tipo string. Normalmente, encajan mejor con colecciones de modelos Eloquent o clases propias.
Comparación con closures normales
Los mensajes de orden superior son concisos, pero no encajan en todos los casos.Usar mensajes de orden superior en clases propias
Para aprovechar el mecanismo deHigherOrderCollectionProxy a través del trait EnumeratesValues, llama a Collection::proxy() para añadir el método al conjunto de proxies.
Próximos pasos
Trait Conditionable
Aprende la implementación interna de
when() / unless() y cómo aplicarla en QueryBuilder y clases propias.