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)
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.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.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
| Aspect | Macroable | ForwardsCalls |
|---|---|---|
| Objectif | Ajouter de nouvelles méthodes à une classe existante | Déléguer des méthodes à un autre objet |
| Points d’entrée principaux | macro(), mixin() | forwardCallTo(), forwardDecoratedCallTo() |
| Cas approprié | Extension d’API | Proxy / Decorator / Adapter |
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().