<code>interface Pay { public function run(); } class Weixin implements Pay { public function run() { echo 'weixin'; } } class Ali implements Pay { public function run() { echo 'ali'; } } class PayServiceProvider extends ServiceProvider { public function register() { $this->app->singleton('weixin', function () { return new Weixin; }); $this->app->singleton('ali', function () { return new Ali; }); } } class A { // 这里注入应该填入什么参数? 怎么确定注入的是哪个类的实例 public functions __construct(Pay $pay) { } } </code>
<code>interface Pay { public function run(); } class Weixin implements Pay { public function run() { echo 'weixin'; } } class Ali implements Pay { public function run() { echo 'ali'; } } class PayServiceProvider extends ServiceProvider { public function register() { $this->app->singleton('weixin', function () { return new Weixin; }); $this->app->singleton('ali', function () { return new Ali; }); } } class A { // 这里注入应该填入什么参数? 怎么确定注入的是哪个类的实例 public functions __construct(Pay $pay) { } } </code>
Service Container
)! 첫째, 바인딩 서비스ID
로 정의된 서비스는 다음과 같이 ID
서비스를 통해서만 얻을 수 있습니다.
<code>// 定义服务 $this->app->singleton('service_id', function () { return new Service(); }) // 获取服务,以下方式等价 $this->app->make('service_id'); $this->app['service_id'];</code>
둘째, 인터페이스의 유형 힌트(Type Hint
)를 통해 서비스를 자동으로 구문 분석하고 주입하려면 다음과 같은 작업을 수행해야 합니다.
<code>// 绑定接口到实例 $this->app->bind('Namespace\To\Your\Interface\Pay', 'Namespace\To\Your\Class\Weixin');</code>
서비스에 주입해야 하는 객체가 서비스 컨테이너(Service Container
)를 통해 구문 분석되면 유형 힌트(Type Hint
)를 사용하여 서비스를 자동으로 구문 분석하고 주입할 수 있습니다. 다음 클래스의 인스턴스는 서비스 컨테이너(controllers, event listeners, queue jobs, middleware
등)와 서비스 컨테이너에 바인딩된 서비스(Service Container
)를 통해 해결됩니다.
셋째, 위와 같이 인터페이스를 인스턴스에 바인딩하면 하나의 인스턴스로만 자동으로 해석될 수 있습니다. 즉, 원하는 결과가 다른 클래스인 경우 생성자는 유형 힌트( Type Hint
) 다음과 같이 동일한 인터페이스를 다른 인스턴스에 삽입할 수 있습니다(컨텍스트 바인딩, Context Binding
).
<code>$this->app->when('Namespace\To\Your\Class\A') ->needs('Namespace\To\Your\Interface\Pay') ->give('Namespace\To\Your\Class\Weixin'); $this->app->when('Namespace\To\Your\Class\B') ->needs('Namespace\To\Your\Interface\Pay') ->give('Namespace\To\Your\Class\Ali');</code>
컨텍스트 바인딩을 통해 A 인스턴스는 Weixin 인스턴스에 주입되고, B 인스턴스는 Ali 인스턴스에 주입됩니다. 아래와 같습니다:
<code>class A { public functions __construct(Pay $pay) { var_dump($pay instanceof Weixin); // True } } class B { public functions __construct(Pay $pay) { var_dump($pay instanceof Ali); // True } }</code>