ForwardsCalls 트레이트란
Illuminate\Support\Traits\ForwardsCalls는 어떤 오브젝트로의 메서드 위임을 공통화하는 트레이트입니다. Laravel 본체에서는 Eloquent나 Mail 등의 “래퍼 오브젝트”에서 사용되고 있습니다.
구현은
src/Illuminate/Support/Traits/ForwardsCalls.php에 있습니다. 존재하지 않는 메서드를 전달한 경우, 호출자 클래스명을 포함한 BadMethodCallException으로 정형화해 재던집니다.코어 API
forwardCallTo($object, $method, $parameters)
지정된 오브젝트로 메서드를 그대로 전달합니다. 전형적으로는 __call()에서 호출합니다.
forwardDecoratedCallTo($object, $method, $parameters)
Builder나 Decorator에서 체인을 유지하고 싶을 때 사용합니다. 전달 대상 메서드의 반환값이 “전달 대상 오브젝트 자신”이라면 “호출자 오브젝트($this)“로 바꿔서 반환합니다.
__call() / __callStatic()과의 조합
ForwardsCalls는 매직 메서드를 제공하지 않습니다. 여러분의 클래스 측에서 __call()(필요하면 __callStatic())을 구현하고, 그 안에서 forwardCallTo 계열 메서드를 호출합니다.
실제 사용 예(Laravel 내부)
Facade는 static proxy를 제공한다
Illuminate\Support\Facades\Facade는 __callStatic()으로 root instance에 직접 위임합니다. Facade는 static 호출이므로 ForwardsCalls가 아니라 직접 전달하는 구현입니다.Eloquent Builder는 forwardCallTo를 사용한다
Illuminate\Database\Eloquent\Builder::__call()은 해결되지 않은 메서드를 내부 Query Builder로 forwardCallTo($this->query, ...)로 전달하고, 마지막에 $this를 반환하여 fluent chain을 유지합니다.기본적인 프록시 구현(forwardCallTo)
CourierProxy는 CourierDriver의 public API를 투명하게 노출할 수 있습니다.
메서드 체인 대응 프록시(forwardDecoratedCallTo)
BadMethodCallException 자동 스로우
존재하지 않는 메서드를 호출하면,ForwardsCalls는 호출자 클래스명을 사용해 BadMethodCallException을 다시 던집니다.
Macroable과의 비교
| 관점 | Macroable | ForwardsCalls |
|---|---|---|
| 목적 | 기존 클래스에 새 메서드 추가 | 다른 오브젝트로 메서드 위임 |
| 주요 입구 | macro(), mixin() | forwardCallTo(), forwardDecoratedCallTo() |
| 적합한 케이스 | API 확장 | Proxy / Decorator / Adapter |
패키지 개발에서의 활용 예
1) Driver를 전환하는 Manager
2) 여러 백엔드를 가진 Adapter
HTTP / Queue / WebSocket 등 다른 백엔드를 하나의 API로 통일하여 위임할 수 있습니다.3) 테스트용 Spy / Stub
실제 드라이버 대신 Spy를 주입하고, 호출은forwardCallTo로 그대로 흘려서 호출 횟수와 인수를 검증할 수 있습니다.
관련 페이지
Macroable 트레이트
기존 클래스에 새로운 메서드를 추가하는 확장 패턴을 배웁니다.
Conditionable 트레이트
when() / unless()를 사용한 조건 분기 체인의 설계를 배웁니다.