Was sind Higher-Order Messages?
Higher-Order Messages sind eine Syntax, mit der Sie Collection-Methoden wie einen Property-Zugriff aufrufen. Ohne einen Callback zu schreiben, können Sie für jedes Element eine Methode aufrufen oder eine Property abfragen.$users->map->name bedeutet „aus jedem Nutzer die Property name entnehmen und mit map verarbeiten”.
Funktionsweise — HigherOrderCollectionProxy
Wenn Sie wie in$collection->map als Property zugreifen, wird __get() des Traits EnumeratesValues aufgerufen.
$proxies enthalten, wird eine Instanz von HigherOrderCollectionProxy zurückgegeben. Dieser Proxy hält die Collection und den Methodennamen fest.
Property-Zugriff über __get proxieren
Greifen Sie danach auf eine Property zu (->name), wird __get() des Proxys aufgerufen.
$users->map->name äquivalent zu:
Methodenaufruf über __call proxieren
Rufen Sie im Anschluss eine Methode auf (->activate()), wird __call() des Proxys ausgeführt.
$users->each->activate() entspricht:
Liste unterstützter Methoden
Welche Methoden als Higher-Order Message verwendbar sind, definiert das Array$proxies.
Collection::proxy() hinzu.
Praktische Anwendungsfälle
Collections von Eloquent-Modellen
Higher-Order Messages sind bei Eloquent-Collections besonders praktisch.Filtern
Aggregation
Gruppieren und sortieren
Mit flatMap verschachtelte Strukturen entpacken
Bedingungen prüfen
Collections aus Strings
Auch bei Collections aus Strings können Sie sie nutzen. Der__call()-Proxy ruft die Methode bei Strings als statische Methode auf.
Für Higher-Order Messages auf String-Collections muss die Methode statisch für den String-Typ definiert sein. Natürlicher ist der Einsatz bei Collections von Eloquent-Modellen oder eigenen Klassen.
Vergleich mit klassischen Closures
Higher-Order Messages sind kompakt, decken aber nicht jede Situation ab.Higher-Order Messages in eigenen Klassen einsetzen
Um den Mechanismus vonHigherOrderCollectionProxy über den Trait EnumeratesValues zu nutzen, registrieren Sie Methoden per Collection::proxy() als Proxy-Ziele.
Nächste Schritte
Conditionable-Trait
Lernen Sie die interne Implementierung von
when() / unless() und deren Einsatz im QueryBuilder oder in eigenen Klassen.