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)
CourierProxy de publieke API van CourierDriver transparant blootstellen.
Proxy met method chaining (forwardDecoratedCallTo)
Automatisch gooien van BadMethodCallException
Als je een niet-bestaande methode aanroept, gooitForwardsCalls een BadMethodCallException opnieuw met de naam van de aanroepende klasse.
Vergelijking met Macroable
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 viaforwardCallTo 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().