Was ist der ForwardsCalls-Trait?
Illuminate\Support\Traits\ForwardsCalls ist ein Trait, der die Delegation von Methoden an ein anderes Objekt vereinheitlicht. Im Laravel-Kern wird er in „Wrapper-Objekten” wie Eloquent oder Mail eingesetzt.
Die Implementierung befindet sich unter
src/Illuminate/Support/Traits/ForwardsCalls.php. Beim Weiterleiten einer nicht existierenden Methode wird eine BadMethodCallException mit dem aufrufenden Klassennamen erneut geworfen.Kern-API
forwardCallTo($object, $method, $parameters)
Leitet die Methode unverändert an das angegebene Objekt weiter. Der typische Aufrufort ist __call().
forwardDecoratedCallTo($object, $method, $parameters)
Nützlich, wenn Sie in einem Builder oder Decorator die Chain aufrechterhalten wollen. Gibt die weitergeleitete Methode „das Zielobjekt selbst” zurück, wird stattdessen das „aufrufende Objekt ($this)” zurückgegeben.
Kombination mit __call() / __callStatic()
ForwardsCalls liefert keine Magic Methods. Sie implementieren __call() (bei Bedarf auch __callStatic()) in Ihrer Klasse und rufen dort die forwardCallTo-Methoden auf.
Reale Anwendungsbeispiele (Laravel-intern)
1
Facade stellt einen Static Proxy bereit
Illuminate\Support\Facades\Facade delegiert in __callStatic() direkt an die Root-Instanz. Da Facades statisch aufgerufen werden, ist das keine Verwendung von ForwardsCalls, sondern eine direkte Weiterleitung.2
Der Eloquent Builder nutzt forwardCallTo
Illuminate\Database\Eloquent\Builder::__call() reicht unbekannte Methoden über forwardCallTo($this->query, ...) an den internen Query Builder weiter und gibt am Ende $this zurück, um die Fluent Chain zu erhalten.3
Relation / Mail / Event verwenden forwardDecoratedCallTo
In
Illuminate\Database\Eloquent\Relations\Relation, Illuminate\Mail\Message und Illuminate\Events\NullDispatcher kommt forwardDecoratedCallTo zum Einsatz — es delegiert an das interne Objekt und bewahrt gleichzeitig die Chain der äußeren API.Einfache Proxy-Implementierung (forwardCallTo)
CourierProxy die public API des CourierDriver transparent offen.
Method-Chain-fähiger Proxy (forwardDecoratedCallTo)
Automatisches Werfen einer BadMethodCallException
Wird eine nicht existierende Methode aufgerufen, wirftForwardsCalls eine neue BadMethodCallException mit dem aufrufenden Klassennamen.
Vergleich mit Macroable
Anwendungsbeispiele in der Paketentwicklung
1) Manager, der Treiber umschaltet
2) Adapter mit mehreren Backends
Unterschiedliche Backends wie HTTP, Queue oder WebSocket lassen sich hinter einer einheitlichen API bündeln.3) Spy / Stub für Tests
Statt eines echten Drivers injizieren Sie einen Spy — die Aufrufe werden perforwardCallTo unverändert durchgereicht, und Sie können Anzahl sowie Argumente der Aufrufe prüfen.
Verwandte Seiten
Macroable-Trait
Lernen Sie das Erweiterungsmuster kennen, um bestehenden Klassen neue Methoden hinzuzufügen.
Conditionable-Trait
Lernen Sie den Entwurf von Bedingungs-Chains mit
when() / unless() kennen.