Skip to main content

Qu’est-ce qu’un message d’ordre supérieur

Les messages d’ordre supérieur (Higher-order Messages) sont une syntaxe qui permet d’appeler les méthodes d’une collection sous la forme d’un accès à une propriété. Sans écrire de callback, vous pouvez appeler une méthode ou récupérer une propriété sur chaque élément.
$users->map->name signifie « extraire la propriété name de chaque utilisateur et faire un map ».

Fonctionnement — HigherOrderCollectionProxy

Lorsque vous accédez à $collection->map comme à une propriété, la méthode __get() du trait EnumeratesValues est appelée.
Si le nom de la méthode figure dans $proxies, une instance de HigherOrderCollectionProxy est retournée. Ce proxy conserve deux informations : la collection et le nom de la méthode.

Proxy d’accès aux propriétés via __get

Si vous accédez ensuite à une propriété (->name), le __get() du proxy est appelé.
Autrement dit, $users->map->name équivaut à :

Proxy d’appel de méthode via __call

Si vous appelez ensuite une méthode (->activate()), le __call() du proxy est invoqué.
$users->each->activate() équivaut à :

Liste des méthodes prises en charge

Les méthodes utilisables comme messages d’ordre supérieur sont définies dans le tableau $proxies.
Pour ajouter une méthode personnalisée, utilisez Collection::proxy().

Cas d’utilisation pratiques

Collections de modèles Eloquent

Les messages d’ordre supérieur sont particulièrement pratiques avec les collections Eloquent.

Filtrage

Agrégation

Groupement / tri

Déployer une imbrication avec flatMap

Vérification de conditions

Collections de chaînes

Cela fonctionne aussi pour des collections dont les valeurs sont des chaînes. Le __call() du proxy les appelle alors comme méthodes statiques.
Utiliser des messages d’ordre supérieur sur une collection de chaînes nécessite que la méthode soit définie statiquement sur le type string. En pratique, c’est plus naturel avec des collections de modèles Eloquent ou de classes maison.

Comparaison avec les closures classiques

Les messages d’ordre supérieur sont concis, mais ne conviennent pas à tous les cas.
Pour « extraire la même propriété de chaque élément » ou « appeler la même méthode sur chaque élément », les messages d’ordre supérieur sont plus lisibles. Si la condition est complexe ou si les arguments sont dynamiques, préférez les closures.

Utiliser des messages d’ordre supérieur avec vos classes personnalisées

Pour bénéficier du mécanisme HigherOrderCollectionProxy via le trait EnumeratesValues, appelez Collection::proxy() pour ajouter la méthode aux cibles du proxy.

Étapes suivantes

Trait Conditionable

Découvrez l’implémentation interne de when() / unless() et son application à QueryBuilder ou à vos propres classes.
Dernière modification le 13 juillet 2026