魔法使いの卵

WEBエンジニアの卵の成長記録

Laravelエキスパート養成読本メモ(IoCコンテナ)

サービスコンテナ(IoCコンテナ)

サービスコンテナとは

  • DIを使ってクラス間の依存関係の解決を行います。
  • DIを使用することでクラスの依存関係をサービスプロパイダにもたせれる
  • 結果的に柔軟でテストをしやすいプログラムをかける

機能

大きく分けて2つある

サービスコンテナの動き

  1. サービスプロパイダ 
  2. サービス(Ioc)コンテナ
    • 依存の注入
  3. クラス

サービスプロパイダ

  • Laravel5に表記されているコメント
    自動ロードされるサービスプロバイダー
    ここにリストしたサービスプロバイダーはアプリケーションのリクエストに対し
    自動的にロードされます。アプリケーションの機能を拡張するため、この配列へ
    自由に自分のサービスを付け加えてください。
  • サービスコンテナへの登録を行うクラス
  • アプリケーションの起動時に読み込まれる
  • キーワードに対応するクラスやインスタンスを管理する
  • サービスプロパイダー一覧
    • app/config/app.phpのproviders

コンポーネント 【 component 】

部品、成分、構成要素などの意味を持つ英単語。ITの分野では機器やソフトウェア、システムの構成する部品や要素などのことを意味する。
ソフトウェアの分野では、特定の機能を持ち単体で完結しているが、単体では使用せず(できず)他のプログラムから呼び出されたり連結されたりして使用されるプログラム部品のことをコンポーネントということが多い。
意味の似た単語に「モジュール」(module)があるが、語義に明確な違いはなくほとんど同じ概念として用いられことが多い。ただし、モジュールには「システムや他の部品への接合部の仕様が標準化され、容易に追加や交換ができるような構成要素」といった意味合いが込められることが多いのに対し、コンポーネントは単純に要素や部品一般のことを指すことが多い。

DI(依存関係注入)

DIの種類は2つある

コンテキストバインディング

使うシーン

  1. Animalインターフェースを注入した犬Dogクラスを取り出せるようにした
  2. あるクラスでは同じAnimalインターフェースを実装したCatクラスを取り出したい

  3. (例)

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)