Cos’è il trait ForwardsCalls
Illuminate\Support\Traits\ForwardsCalls è un trait che centralizza la delega dei metodi verso un altro oggetto. Nel core di Laravel è utilizzato dai “wrapper” come Eloquent o Mail.
L’implementazione si trova in
src/Illuminate/Support/Traits/ForwardsCalls.php. Se inoltri un metodo inesistente, rilancia una BadMethodCallException formattata con il nome della classe chiamante.API principali
forwardCallTo($object, $method, $parameters)
Inoltra un metodo così com’è all’oggetto specificato. Tipicamente viene chiamato da __call().
forwardDecoratedCallTo($object, $method, $parameters)
Usato in builder e decorator per mantenere la catena. Se il metodo di destinazione restituisce “l’oggetto di destinazione stesso”, il valore viene sostituito con “l’oggetto chiamante ($this)”.
Combinazione con __call() / __callStatic()
ForwardsCalls non fornisce metodi magic. Sei tu ad implementare __call() (e se serve __callStatic()) nella tua classe e da lì chiami i metodi forwardCallTo*.
Esempi d’uso reali (interno a Laravel)
I Facade forniscono uno static proxy
Illuminate\Support\Facades\Facade delega direttamente all’istanza root con __callStatic(). Poiché i facade sono chiamate statiche, l’implementazione è un forwarding diretto e non usa ForwardsCalls.L'Eloquent Builder usa forwardCallTo
Illuminate\Database\Eloquent\Builder::__call() passa i metodi non risolti al Query Builder interno con forwardCallTo($this->query, ...) e infine restituisce $this per mantenere la fluent chain.Implementazione base di un proxy (forwardCallTo)
CourierProxy espone in modo trasparente l’API pubblica di CourierDriver.
Proxy compatibile con method chaining (forwardDecoratedCallTo)
Lancio automatico di BadMethodCallException
Se chiami un metodo inesistente,ForwardsCalls rilancia una BadMethodCallException usando il nome della classe chiamante.
Confronto con Macroable
| Aspetto | Macroable | ForwardsCalls |
|---|---|---|
| Scopo | Aggiungere nuovi metodi a una classe esistente | Delegare metodi a un altro oggetto |
| Ingressi principali | macro(), mixin() | forwardCallTo(), forwardDecoratedCallTo() |
| Casi adatti | Estensione di API | Proxy / Decorator / Adapter |
Esempi d’uso nello sviluppo di pacchetti
1) Manager che cambia driver
2) Adapter con più backend
Backend diversi come HTTP / Queue / WebSocket possono essere delegati a un’unica API unificata.3) Spy / Stub per i test
Al posto del driver reale puoi iniettare uno spy, lasciando che le chiamate passino attraversoforwardCallTo e verificando numero di chiamate e argomenti.
Pagine correlate
Trait Macroable
Impara il pattern di estensione per aggiungere metodi a classi esistenti.
Trait Conditionable
Impara a progettare catene condizionali con
when() / unless().