Wat zijn higher-order messages
Higher-order messages zijn een syntaxis waarmee je collectiemethodes aanroept in de vorm van property-toegang. Zonder een callback te schrijven kun je op elk element een methode aanroepen of een property ophalen.$users->map->name betekent “haal van elke gebruiker de property name op en map daarover”.
Hoe het werkt — HigherOrderCollectionProxy
Wanneer je zoals bij$collection->map als property toegang zoekt, wordt __get() van de trait EnumeratesValues aangeroepen.
$proxies, krijg je een instantie van HigherOrderCollectionProxy terug. Deze proxy houdt twee dingen bij: de collectie en de methodenaam.
Property-toegang via __get proxyen
Als je vervolgens een property benadert (->name), wordt __get() van de proxy aangeroepen.
$users->map->name is gelijk aan het volgende.
Methode-aanroepen via __call proxyen
Als je vervolgens een methode aanroept (->activate()), wordt __call() van de proxy aangeroepen.
$users->each->activate() is gelijk aan het volgende.
Overzicht van ondersteunde methodes
De methodes die je als higher-order message kunt gebruiken, zijn gedefinieerd in de array$proxies.
Collection::proxy().
Praktische use cases
Collecties van Eloquent-modellen
Higher-order messages zijn vooral handig bij Eloquent-collecties.Filteren
Aggregatie
Groeperen en sorteren
Geneste structuren afvlakken met flatMap
Voorwaarden controleren
Stringcollecties
Ze werken ook op collecties waarvan de waarden strings zijn. De__call() van de proxy roept in het geval van een string de methode statisch aan.
Voor higher-order messages op stringcollecties moet de methode statisch gedefinieerd zijn op het stringtype. Normaal gesproken is het natuurlijker om ze te gebruiken met collecties van Eloquent-modellen of eigen klassen.
Vergelijking met gewone closures
Higher-order messages zijn beknopt, maar niet in alle gevallen bruikbaar.Higher-order messages gebruiken met eigen klassen
Om via de traitEnumeratesValues het mechanisme van HigherOrderCollectionProxy te benutten, roep je Collection::proxy() aan om de methode toe te voegen aan de proxy-doelen.
Volgende stap
Conditionable-trait
Leer de interne implementatie van
when() / unless() en hoe je die toepast op de Query Builder en eigen klassen.