Qu’est-ce que le trait ForwardsCalls
Illuminate\Support\Traits\ForwardsCalls est un trait qui mutualise la délégation d’appels de méthodes vers un autre objet. Dans le cœur de Laravel, il est utilisé par les « objets wrappers » comme Eloquent ou Mail.
L’implémentation se trouve dans
src/Illuminate/Support/Traits/ForwardsCalls.php. Lorsqu’une méthode inexistante est transférée, l’exception BadMethodCallException est reformatée pour inclure le nom de la classe appelante et relancée.API de base
forwardCallTo($object, $method, $parameters)
Transfère directement une méthode à l’objet spécifié. Typiquement appelé depuis __call().
forwardDecoratedCallTo($object, $method, $parameters)
À utiliser quand un Builder ou un Decorator veut préserver le chaînage. Si la valeur de retour de la méthode ciblée est « l’objet de destination lui-même », elle est remplacée par « l’objet appelant ($this) » avant d’être retournée.
Combinaison avec __call() / __callStatic()
ForwardsCalls ne fournit pas de méthodes magiques. Vous implémentez __call() (et si besoin __callStatic()) dans votre classe et vous y appelez les méthodes forwardCallTo....
Exemples d’utilisation réels (interne à Laravel)
1
Les Facades fournissent un static proxy
Illuminate\Support\Facades\Facade délègue directement à l’instance racine via __callStatic(). Les facades étant des appels statiques, elles utilisent une délégation directe et non ForwardsCalls.2
Eloquent Builder utilise forwardCallTo
Illuminate\Database\Eloquent\Builder::__call() transmet les méthodes non résolues au Query Builder interne via forwardCallTo($this->query, ...), puis retourne $this en fin de traitement pour préserver la chaîne fluide.3
Relation / Mail / Event utilisent forwardDecoratedCallTo
Illuminate\Database\Eloquent\Relations\Relation, Illuminate\Mail\Message et Illuminate\Events\NullDispatcher utilisent forwardDecoratedCallTo : ils délèguent à l’objet interne tout en préservant le chaînage de l’API externe.Implémentation de base d’un proxy (forwardCallTo)
CourierProxy expose de façon transparente l’API publique de CourierDriver.
Proxy compatible chaînage (forwardDecoratedCallTo)
Lancement automatique de BadMethodCallException
Lorsqu’une méthode inexistante est appelée,ForwardsCalls relance une BadMethodCallException avec le nom de la classe appelante.
Comparaison avec Macroable
Exemples d’utilisation dans le développement de packages
1) Manager qui bascule entre plusieurs Drivers
2) Adapter à plusieurs backends
Différents backends (HTTP, Queue, WebSocket, etc.) peuvent être délégués à travers une API unifiée.3) Spy / Stub pour les tests
À la place du driver réel, injectez un Spy et faites transiter les appels viaforwardCallTo tout en vérifiant le nombre d’appels et les arguments.
Pages associées
Trait Macroable
Découvrez le pattern d’extension qui ajoute de nouvelles méthodes à une classe existante.
Trait Conditionable
Apprenez à concevoir des chaînes conditionnelles avec
when() / unless().