Laravelのサービスコンテナについて調べたことを簡単にまとめます。
そもそもサービスコンテナとは?
LaravelではDIコンテナをサービスコンテナと呼びます。
簡単にいうと、サービスを格納できる入れ物です。
そして、**格納しているサービスを使うこと(インスタンス化)**ができる。
サービスとは、色々な機能(メール送信など)のこと。
クラスを入れておくものぐらいのイメージでも良いと思います。(たぶん)
サービスコンテナの使い方
()の箇所は省略可能です。
1.サービス化したいクラスを作る
2.(サービスプロバイダを作って app.php に登録する|AppServiceProviderを使う)
3.(registerにインスタンス化する方法を定義しておく)
4.(bootでサービス同士の依存関係を解決する)
5.(ファサードを定義して app.phpに登録する)
6.サービスコンテナにインスタンスを提供してもらう
参照:第1回 もう怖くない DIだって知らなくていい こんなにカンタンだから今日から Laravelのサービスコンテナ を使ってみて!
要するに最低限の機能で使うなら、1と6だけでOK。
記述すると、次の通り。(引数にクラスを入れてあげるとインスタンス化できる。)
$sampleobject = app()->make('App\SampleClass');
//new で書く場合
$sampleobject = new App\SampleClass;
サービスコンテナはクラスの依存を解決するためのもの
今紹介したように、サービスコンテナは最低限の機能だけを利用するなら、超簡単。
でもこれだと「何のためにあるの?」ってことになりますよね。
結論から言うと『クラスの依存を解決するため』らしいです。
ちょっと難しい話ですが、要するにクラスに依存しているものを自動的に解決してくれるのがサービスコンテナとのこと。
これらによって、下記のメリットがあります。
(1)テスト時にはアプリケーションコードで生成されるインスタンスをテスト用にすり替えるといったことができたり、
(2)あるインスタンスはアプリケーション実行プロセスで一つだけ(シングルトン)にしたいので、2回目の生成時には前回生成したインスタンスを返す
サービスコンテナへの登録方法
サービスコンテナへの登録方法は2つ。
①bindメソッド・singletonメソッドをコントローラーなどに記述する方法
②サービスプロバイダーを使用する方法
ちなみにbindメソッドとかは下記のように使える。
app()->bind('myclass', Sample\MyClass::class);
app()->singleton('myclass', Sample\MyClass::class);
②の方法でやるなら、
・サービスプロバイダーの作成
・registerメソッド内に処理(インスタンスを返す)を追加
・config/app.phpのproviderに登録
この手順で登録すればOK。