Skip to main content

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.
Ist der Methodenname in $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.
Damit ist $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.
Eigene Methoden fügen Sie über 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.
Wenn Sie „die gleiche Property aus jedem Element ziehen” oder „die gleiche Methode auf jedem Element aufrufen”, ist eine Higher-Order Message besser lesbar. Bei komplexen Bedingungen oder dynamischen Argumenten greifen Sie zur Closure.

Higher-Order Messages in eigenen Klassen einsetzen

Um den Mechanismus von HigherOrderCollectionProxy ü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.
Zuletzt geändert am 13. Juli 2026