サービスコンテナとは?
- Laravelの中のDIコンテナ
- クラスのインスタンスを管理する
- サービスコンテナに登録することでそのクラスをアプリケーションのどこからでも使用することができる
そもそもDIコンテナとは?
- インスタンスの生成を全て別の場所で一括で管理すること
- 単純なDIだけの場合、引数が鬼のような数になる可能性がある
- 上記を解決するのがDIコンテナ
DIとDIコンテナは異なる
DIとは?
- Dependency Injectionの略
- 依存性の注入と言われるが、オブジェクト注入のこと
-
constructor
で引数を元に外部からオブジェクトを注入すること。普通は、newを使う -
Interface
を使って外部注入したほうがより変更に強くなる -
constructor
以外にもsetter
,method
などから注入する方法も存在する - DIとDIじゃない場合の比較をした際のDIのメリット
-
new
しないので、引数のクラスが実装されていなくても動かすことが可能 - 外部注入したクラスに変更があっても、呼び出し元だけを変更すればよい
-
- 参考記事
サービスコンテナ詳細
bind/binding(バインド)
- サービスコンテナに対してインスタンスの生成方法を登録すること
- バインドの定義場所はServiceProviderクラス
- バインドの方法種類
- bind
- 常に新しいインスタンスを生成
- 最も利用される
- bindif
- 引数で指定された文字列に対するバインドが存在しない場合のみインスタンスを生成
- 既に存在していれば何もしない
- singleton
- インスタンスを1つのみにする場合に利用する
- 最初インスタンスを生成して、次からはキャッシュされたインスタンスを返す
- instance
- 既に生成したインスタンスを返す
-
singleton
同様にサービスコンテナにキャッシュされ、生成では同じインスタンスを返す
- bind
resolve/resolving(解決する)
- サービスコンテナが指定されたインスタンスを生成して返すこと
- 解決方法
- makeメソッド
- appヘルパ関数
- 両方同じ挙動で、指定された文字列にバインドされた処理を実行してインスタンスを返す