Laravelエキスパート養成読本メモ(IoCコンテナ)
サービスコンテナ(IoCコンテナ)
サービスコンテナとは
- DIを使ってクラス間の依存関係の解決を行います。
- DIを使用することでクラスの依存関係をサービスプロパイダにもたせれる
- 結果的に柔軟でテストをしやすいプログラムをかける
機能
大きく分けて2つある
サービスコンテナの動き
サービスプロパイダ
- Laravel5に表記されているコメント
自動ロードされるサービスプロバイダー ここにリストしたサービスプロバイダーはアプリケーションのリクエストに対し 自動的にロードされます。アプリケーションの機能を拡張するため、この配列へ 自由に自分のサービスを付け加えてください。
- サービスコンテナへの登録を行うクラス
- アプリケーションの起動時に読み込まれる
- キーワードに対応するクラスやインスタンスを管理する
- サービスプロパイダー一覧
- app/config/app.phpのproviders
コンポーネント 【 component 】
部品、成分、構成要素などの意味を持つ英単語。ITの分野では機器やソフトウェア、システムの構成する部品や要素などのことを意味する。 ソフトウェアの分野では、特定の機能を持ち単体で完結しているが、単体では使用せず(できず)他のプログラムから呼び出されたり連結されたりして使用されるプログラム部品のことをコンポーネントということが多い。 意味の似た単語に「モジュール」(module)があるが、語義に明確な違いはなくほとんど同じ概念として用いられことが多い。ただし、モジュールには「システムや他の部品への接合部の仕様が標準化され、容易に追加や交換ができるような構成要素」といった意味合いが込められることが多いのに対し、コンポーネントは単純に要素や部品一般のことを指すことが多い。
DI(依存関係注入)
DIの種類は2つある
- コンストラクタインジェクション
- コンストラクタの引数で注入する
- メソッドインジェクション
- メソッドの引数で注入する
- Laravel4まではDIの対象はコンストラクタ
- Laravel5からはコンストラクタとメソッド
コンテキストバインディング
使うシーン
- Animalインターフェースを注入した犬Dogクラスを取り出せるようにした
あるクラスでは同じAnimalインターフェースを実装したCatクラスを取り出したい
(例)
App::when('Tama') // Tamaクラスが生成されるとき ->needs('Animal') // AnimalインターフェースのDI要求がきたら ->give('cat') // CatクラスをDIします
遅延ロード
- リクエストごとに必ずサービスコンテナに登録するクラスに関しては関係ない
- 実行して必要になるまでインスタンスを作成する必要がないクラスに対して使う
- $deferプロパティとprovidesメソッドはサービスコンテナへの登録を必要になるまで遅延させれる
- サービスプロパイダはアプリケーション起動時に読み込まれてコンテナにクラスが登録されていく
- deferプロパティをtrueにしてprovidesメソッドの戻り値を遅延させる対象のキーを含んだ配列を返す
- ユーザが必要になるまでインスタンスは生成されない
感想
- 0よりも1でもわかってるほうがいいとおもって読んでみた
- 内容はすごいわかりやすく書かれているから読みやすかった
- Laravelのことを少しだけほんのちょっとわかった気がするw
参考元:
Laravelエキスパート養成読本[モダンな開発を実現するPHPフレームワーク!] (Software Design plus)