【Laravel】サービスコンテナを理解する
Laravel 5.3のドキュメント
読んでみる
クラス間の依存を管理するツール
コンストラクタやセッターメソッドを使って、あるクラスを注入するということらしい
初学者向け解説
クラスをインスタンス化するときに使用する。2つの便利な点がある
依存解決
インスタンス化の方法のカスタマイズ
通常インスタンス化は$user = new User;という形で行うが、それとはまた別のやり方。
依存解決
code:php
class A {
public function __construct(B $class_b) {
...
}
}
class B {
public function __construct() {
...
}
}
Aのインスタンスを作るためには、まずBを定義して、それを渡さないといけない
code:php
$b = new B;
$a = new A($b);
サービスコンテナを使うことで、自動でBを用意してくれる
code:php
// サービスコンテナを使用した記述方法。make()はサービスコンテナが持つメソッド
$a = app()->make(A::class);
Aをのクラスを作るためにBがいるので、Bをプログラム側で作ってくれる
「依存解決」とどう繋がるのか
Aを作るためにはBが必要だった。(Aの生成はBに依存しているといえる)
Bを作るのにCが、Cを作るのにDが必要だとしたら?
サービスコンテナは、この依存解決を再起的におこなってくれる
$a = app()->make(A::class);とすることで、Dまで必要なのだとしたらD,C,Bも作ってくれる
インスタンス化のカスタマイズ
カスタマイズを定義するためには、bind()メソッドを使って行える
code:php
// クラスがあったとして
class Test {
public $string;
public function __construct() { ... }
}
// ----
// bind()で、サービスコンテナでクラス化するときのカスタマイズを定義する
app()->bind(Test::class, function() {
$test = new Test();
$test->string = 'message';
return $test;
});
// インタンス化を行うと、上記の処理を含めて行ってくれる
$test_instance = app()->make(Test::class);
echo($test_instance->string); // message
これをドキュメントでは、結合と呼んでいる。
シングルトンパターン
同じメソッド内などに、特定のインスタンスを複数定義できないようなデザインパターンのこと