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.
$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é.
$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.
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.Utiliser des messages d’ordre supérieur avec vos classes personnalisées
Pour bénéficier du mécanismeHigherOrderCollectionProxy 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.