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)
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.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.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
| Aspekt | Macroable | ForwardsCalls |
|---|---|---|
| Zweck | Neue Methoden an eine bestehende Klasse anfügen | Methoden an ein anderes Objekt delegieren |
| Haupteinstieg | macro(), mixin() | forwardCallTo(), forwardDecoratedCallTo() |
| Geeigneter Anwendungsfall | API-Erweiterung | Proxy / Decorator / Adapter |
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.