役割
アプリケーションに含まれるサービス(機能)の初期化処理を行う目的で用意されているもので、
役割は主に次の3つ。
- サービスコンテナへのバインド。
- イベントリスナーやミドルウェア、ルーティングの登録。
- 外部コンポーネントを組み込む。
基本
読み込むサービスプロバイダは、config/app.phpのprovidersプロパティに定義する。
Laravelの初期処理で、各サービスプロバイダのregisterメソッドが実行され、
全てのregisterメソッド処理が終了すると、次にbootメソッドが呼び出される。
サービスプロバイダはIlluminate\Support\ServiceProviderクラスを継承して実装する。
registerメソッドは必ず実装しなければならない。
bootメソッドの実装は任意。
registerメソッドが実行されるタイミングでは
サービスコンテナから他の機能のインスタンスを取得する処理を実行できないので、
registerメソッドはサービスコンテナへのバインドのみ行う。
他の機能のインスタンスを取得する処理が必要な場合にbootメソッドで実装する。
Illuminate\Database\DatabaseServiceProviderクラスを参照するとわかりやすい。
遅延実行
Illuminate\Constracts\Support\DeferrableProviderインターフェイスを実装すると、遅延実行が可能。
この場合、registerメソッドの実行タイミングを指定するために、providesメソッドやwhenメソッドを実装する必要がある。
providesメソッドならサービスコンテナで解決する文字列を指定し、
whenメソッドならイベントを指定する必要がある。
providesメソッドは文字列の解決をサービスコンテナに依頼したタイミングで、registerメソッドが呼ばれて解決が行われる。
whenメソッドはイベントが発生するとregisterメソッドが呼ばれて解決が行われる。
(サービスコンテナでの解決やイベントが発生しなければ、インスタンス登録は行われない)
Illuminate\Cache\CacheServiceProviderクラスを参照するとわかりやすい。