Qué es el trait ForwardsCalls
Illuminate\Support\Traits\ForwardsCalls es un trait que unifica la delegación de métodos hacia otro objeto. En el propio Laravel se usa en objetos “envoltorio” como los de Eloquent y Mail.
La implementación está en
src/Illuminate/Support/Traits/ForwardsCalls.php. Cuando se reenvía un método inexistente, relanza el error como una BadMethodCallException que incluye el nombre de la clase que hizo la llamada.API principal
forwardCallTo($object, $method, $parameters)
Reenvía la llamada al objeto indicado tal cual. Normalmente se invoca desde __call().
forwardDecoratedCallTo($object, $method, $parameters)
Se usa en builders o decorators cuando quieres mantener la cadena. Si el valor devuelto por el método reenviado es el «propio objeto destino», lo sustituye por el «objeto de origen ($this)» y lo devuelve.
Combinación con __call() / __callStatic()
ForwardsCalls no aporta los métodos mágicos. Tú debes implementar __call() (y si hace falta __callStatic()) en tu clase y llamar dentro a los métodos forwardCallTo*.
Ejemplos reales (interior de Laravel)
Los Facades ofrecen un static proxy
Illuminate\Support\Facades\Facade delega directamente en la root instance mediante __callStatic(). Como el Facade se invoca de forma estática, no usa ForwardsCalls, sino un reenvío directo.Eloquent Builder usa forwardCallTo
Illuminate\Database\Eloquent\Builder::__call() pasa los métodos no resueltos al query builder interno con forwardCallTo($this->query, ...) y devuelve $this al final para mantener la fluent chain.Implementación básica de un proxy (forwardCallTo)
CourierProxy expone de forma transparente toda la API pública de CourierDriver.
Proxy con method chaining (forwardDecoratedCallTo)
Lanzamiento automático de BadMethodCallException
Cuando llamas a un método inexistente,ForwardsCalls relanza una BadMethodCallException usando el nombre de la clase que originó la llamada.
Comparación con Macroable
| Aspecto | Macroable | ForwardsCalls |
|---|---|---|
| Objetivo | Añadir métodos nuevos a una clase existente. | Delegar métodos a otro objeto. |
| Entradas principales | macro(), mixin() | forwardCallTo(), forwardDecoratedCallTo() |
| Casos adecuados | Extensión de API. | Proxy / Decorator / Adapter. |
Ejemplos de uso en el desarrollo de paquetes
1) Manager que cambia de driver
2) Adapter con varios backends
Puedes unificar backends distintos (HTTP / Queue / WebSocket) tras una única API común y delegar en cada uno.3) Spy / Stub para tests
En lugar del driver real, inyectas un Spy y dejas pasar las llamadas conforwardCallTo para verificar cuántas veces se llamó y con qué argumentos.
Páginas relacionadas
Trait Macroable
Aprende el patrón para extender clases existentes con nuevos métodos.
Trait Conditionable
Aprende a diseñar cadenas con bifurcaciones condicionales mediante
when() / unless().