Skip to main content

Wat is de ForwardsCalls-trait

Illuminate\Support\Traits\ForwardsCalls is een trait die het delegeren van methodes naar een ander object standaardiseert. In Laravel zelf wordt hij gebruikt in “wrapper-objecten” zoals Eloquent en Mail.
De implementatie staat in src/Illuminate/Support/Traits/ForwardsCalls.php. Als je een niet-bestaande methode doorstuurt, wordt de fout opnieuw gegooid als een BadMethodCallException met de naam van de aanroepende klasse erin.

Kern-API

forwardCallTo($object, $method, $parameters)

Stuurt een methode ongewijzigd door naar het opgegeven object. Meestal roep je dit aan vanuit __call().

forwardDecoratedCallTo($object, $method, $parameters)

Gebruik je wanneer je in een Builder of Decorator de chain wilt behouden. Als de doorgestuurde methode “het doelobject zelf” teruggeeft, wordt dit vervangen door “het aanroepende object ($this)”.

Combineren met __call() / __callStatic()

ForwardsCalls levert zelf geen magic methods. Je implementeert in je eigen klasse __call() (en zo nodig __callStatic()) en roept daarbinnen de forwardCallTo-methodes aan.

Praktijkvoorbeelden (binnen Laravel)

1

Facades bieden een static proxy

Illuminate\Support\Facades\Facade delegeert via __callStatic() rechtstreeks naar de root instance. Omdat facades statische aanroepen zijn, gebruikt de implementatie directe forwarding in plaats van ForwardsCalls.
2

De Eloquent Builder gebruikt forwardCallTo

Illuminate\Database\Eloquent\Builder::__call() geeft onopgeloste methodes met forwardCallTo($this->query, ...) door aan de interne Query Builder en geeft daarna $this terug om de fluent chain te behouden.
3

Relation / Mail / Event gebruiken forwardDecoratedCallTo

In Illuminate\Database\Eloquent\Relations\Relation, Illuminate\Mail\Message en Illuminate\Events\NullDispatcher wordt forwardDecoratedCallTo gebruikt: er wordt gedelegeerd naar het interne object, terwijl de chain van de buitenste API behouden blijft.

Basisimplementatie van een proxy (forwardCallTo)

In deze vorm kan CourierProxy de publieke API van CourierDriver transparant blootstellen.

Proxy met method chaining (forwardDecoratedCallTo)

In plaats van handmatig return $this te schrijven, is het veiliger om te vertrouwen op de regel van forwardDecoratedCallTo: “als de returnwaarde het doelobject zelf is, vervang die dan door $this”.

Automatisch gooien van BadMethodCallException

Als je een niet-bestaande methode aanroept, gooit ForwardsCalls een BadMethodCallException opnieuw met de naam van de aanroepende klasse.
Zo kan de gebruiker meteen achterhalen “in welke buitenste API het misging”.

Vergelijking met Macroable

Als je ForwardsCalls gebruikt terwijl je eigenlijk “methodes wilt toevoegen”, zullen methodes die het doelobject niet heeft altijd falen. Kies Macroable als API-uitbreiding je doel is.

Toepassingen in pakketontwikkeling

1) Een Manager die van driver wisselt

2) Een Adapter met meerdere backends

Verschillende backends zoals HTTP, Queue of WebSocket kun je onder één API verenigen en de aanroepen delegeren.

3) Spy / Stub voor tests

Je kunt een Spy injecteren in plaats van de echte driver, de aanroepen via forwardCallTo gewoon laten doorstromen en vervolgens het aantal aanroepen en de argumenten verifiëren.

Gerelateerde pagina’s

Macroable-trait

Leer het uitbreidingspatroon waarmee je nieuwe methodes toevoegt aan bestaande klassen.

Conditionable-trait

Leer hoe je voorwaardelijke chains ontwerpt met when() / unless().
Laatst gewijzigd op 6 september 2026