サービスプロバイダとは
サービスプロバイダは、Laravelアプリケーション全体のブートストラップの中心となる場所です。あなた自身のアプリケーションも、Laravelのすべてのコアサービスも、サービスプロバイダを通じてブートストラップされます。 「ブートストラップ」とは、サービスコンテナへのバインディング、イベントリスナー、ミドルウェア、ルートの登録など、さまざまなものを登録することを意味します。サービスプロバイダはアプリケーションの設定を行う中心的な場所です。 Laravelは内部的に、メーラー、キュー、キャッシュなどのコアサービスをブートストラップするために多くのサービスプロバイダを使用しています。これらのプロバイダの多くは「遅延」プロバイダで、すべてのリクエストでロードされるのではなく、提供するサービスが実際に必要になった時だけロードされます。 ユーザー定義のサービスプロバイダはすべてbootstrap/providers.php ファイルで登録します。
Laravelがリクエストをどのように処理するかについて詳しく知りたい場合は、リクエストライフサイクルのドキュメントを参照してください。
サービスプロバイダを書く
すべてのサービスプロバイダはIlluminate\Support\ServiceProvider クラスを継承します。ほとんどのサービスプロバイダには register メソッドと boot メソッドが含まれます。
新しいプロバイダを生成するには、make:provider Artisanコマンドを使います。Laravelは自動的に新しいプロバイダを bootstrap/providers.php に登録します。
registerメソッド
register メソッド内では、サービスコンテナへのバインディングのみを行ってください。イベントリスナー、ルート、その他の機能を register メソッド内で登録しようとしないでください。まだロードされていないサービスプロバイダが提供するサービスを誤って使用してしまう可能性があります。
$this->app プロパティを通じてサービスコンテナにアクセスできます。
bindingsプロパティとsingletonsプロパティ
多くのシンプルなバインディングを登録する場合、各バインディングを手動で登録する代わりに、bindings プロパティと singletons プロパティを使うことができます。フレームワークがサービスプロバイダをロードすると、これらのプロパティを自動的にチェックしてバインディングを登録します。
bootメソッド
サービスプロバイダ内でビューコンポーザーを登録する場合はboot メソッドで行います。このメソッドは他のすべてのサービスプロバイダが登録された後に呼び出されます。つまり、フレームワークが登録した他のすべてのサービスにアクセスできます。
bootメソッドの依存性注入
boot メソッドでも型ヒントを使って依存を注入できます。サービスコンテナが必要な依存を自動的に注入します。
サービスプロバイダの登録方法
すべてのサービスプロバイダはbootstrap/providers.php ファイルで登録します。このファイルはアプリケーションのサービスプロバイダのクラス名の配列を返します。
Laravel 13では、
config/app.php の providers 配列ではなく、bootstrap/providers.php でサービスプロバイダを登録します。make:provider コマンドを使うと自動的に追加されます。make:provider Artisanコマンドを実行すると、Laravelは自動的にファイルへプロバイダを追加します。手動でプロバイダクラスを作成した場合は、手動でクラスを配列に追加してください。
カスタムサービスプロバイダの作成
実際にカスタムサービスプロバイダを作成してみましょう。1
プロバイダを生成する
Artisanコマンドでサービスプロバイダを生成します。
2
registerメソッドでバインドする
生成されたプロバイダの
register メソッドにバインディングを記述します。3
bootstrap/providers.phpに登録する
make:provider を使った場合は自動登録されます。手動の場合は追加してください。遅延プロバイダ(Deferred Providers)
プロバイダがサービスコンテナへのバインディングのみを登録している場合、登録されたバインディングが実際に必要になるまでその登録を遅延させることができます。このような遅延プロバイダのロードを遅らせることで、すべてのリクエストでファイルシステムからロードされなくなり、アプリケーションのパフォーマンスが向上します。 遅延プロバイダを作成するには、\Illuminate\Contracts\Support\DeferrableProvider インターフェースを実装し、provides メソッドを定義します。provides メソッドはプロバイダが登録するサービスコンテナのバインディングを返します。
次のステップ
サービスコンテナ
サービスコンテナの仕組みとバインディングの詳細を確認します。