サービスコンテナとサービスプロバイダーの要点についてまとめてます。バインド、解決、依存注入(DI)など理解が難しいかもしれませんが、Laravelの根幹を成す機能なので、動作確認などしながら理解するのをおすすめします。
サービスコンテナ
クラス(サービス)のインスタンス化を管理します。
Illuminate\Container\Containerクラス
を継承したIlluminate\Foundation\Applicationクラス
によって実装されています。
インジェクトするクラスを簡単に変更できるので、テストでモックに差し替えたいときなどに便利です。
バインド
サービスコンテナへインスタンス生成方法を結びつけることをバインド
と言います。
下記メソッドでバインドできます。
メソッド | 概要 |
---|---|
bind | newで新しくインスタンスを作成して結合 |
instance | すでに存在するインスタンスを結合 |
singleton | 同じインスタンスを返すように結合 |
以下ケースで活躍します。
- インターフェースと具象クラスを紐付けたいとき
- 実行プロセス上で1つのインスタンスを使いまわしたい(singleton)とき
インターフェースに複数の具象クラスが紐づく時、Aクラスのときには、具象クラスAを利用、Bクラスのときには、具象クラスBを利用といった使い方もできます。
インターフェースに依存してないクラスは、リフレクションで解決するのでバインドの必要はありません。
解決
- サービスコンテナに要求して、インスタンスを取得することを
解決
と言います。 - 「Applicationクラスの
makeメソッド
」 「resolveヘルパー
」などで解決できます。 - 解決するクラスで、コンストラクタの引数を必要としている場合、Applicationクラスの
makeWithメソッド
を利用できます(5.4~)。- ただし、モックには差し替えられません。
依存注入(DI)による解決
コントローラ、イベントリスナ、キュージョブ、ミドルウェアなどについては、タイプヒントで指定すると、サービスコンテナが自動的に解決してくれます。
「コンストラクションインジェクション」と「メソッドインジェクション」が可能です。
- コンストラクションインジェクション
- コンストラクタの引数でタイプヒント
- メソッドインジェクション
- メソッドの引数でタイプヒント
タイプヒントには、インターフェイスと具象クラスを指定できます。
インターフェイスを指定した場合、コンテナに具象クラスを結合する必要があります。
参考
詳しくは、下記サイトで確認できます。
⇒ http://readouble.com/laravel/5.5/ja/container.html
サービスプロバイダー
要点
サービスプロバイダーの要点は以下の通りです。
config/app.php
のproviders配列
にサービスプロバイダーを設定する。- サービスプロバイダーは、初期起動時にロードされる。
- まず全プロバイダーの
registerメソッド
が呼び出される。 - 次に全プロバイダーの
bootメソッド
が呼び出される。
- まず全プロバイダーの
registerメソッド
でサービスコンテナにバインドする。$deferプロパティ
をtrueにすると、遅延登録ができる。
参考
詳しくは、下記サイトで確認できます。
⇒ http://readouble.com/laravel/5.5/ja/providers.html