サービスプロバイダとは
- 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
メソッドが実行され、ロジック側にインスタンスが返される。