サービスプロバイダとは
- Laravelのサービスコンテナへのバインド処理で利用する機能。
- FWやアプリケーションに含まれるサービス(機能)の初期処理を行う。
- Laravelのライフサイクルでは、ビジネスロジックが実行される前に、サービスプロバイダのメソッドが呼ばれる。
役割
- サービスコンテナへのバインド
- イベントリスナーやミドルウェア、ルーティングの登録
- 外部コンポーネントを組み込む
基本的な動作
- Laravelの初期処理で、各サービスプロバイダの
registerメソッドが実行される。 -
registerメソッドでは、サービスコンテナへのバインドのみ行う。(メソッドの実行タイミングでは、サービスコンテナから他の機能のインスタンスを取得する処理を実行できないため。) - すべての
register処理が終わると、bootメソッドが呼ばれる。 -
registerメソッドの実装は必須、bootメソッドは任意。
deferプロパティによる遅延実行
-
deferプロパティをtrueに設定することで、アプリケーション起動時のregisterメソッドの実行を遅らせることができる(デフォルトはfalse)。 - この場合、
registerメソッドの実行タイミングを指定するため、providesメソッドもしくはwhenメソッドで指定する必要がある。
providesメソッド
- サービスコンテナで解決する文字列を指定する。
- 文字列の解決をサービスコンテナに依頼したタイミングで、サービスプロバイダの
registerメソッドが呼ばれ、解決が行われる。
whenメソッド
- イベントを指定する。
- 対象イベント名を配列で指定すると、リスナーが登録され、その中でサービスプロバイダの
registerメソッドが実行される。 - 設定したイベントが発行されると、このリスナーが発動して、
registerメソッドが実行される。
※ provides、whenいずれの場合も、サービスコンテナでの解決やイベントの発行がアプリケーション内で実行されるまで、インスタンス登録は行われない。
コード例
class SampleServiceProvider extends ServiceProvider
{
protected $defer = true;
public function register()
{
$this->app->singleton('foo', function ($app) {
return new Foo($app);
});
$this->app->singleton('bar', function ($app) {
return new Bar($app);
});
$this->app->singleton('buzz', function ($app) {
return new Buzz($app);
});
}
public function provides()
{
return [
'foo', 'bar', 'buzz'
];
}
}
上記の例では、サービスプロバイダのprovidesメソッドで、文字列を要素とした配列を返している。ビジネスロジックでfooなどのクラス名をサービスコンテナで解決すると、registerメソッドが実行され、ロジック側にインスタンスが返される。