サービスコンテナ
laravelでユニットテストを実行する段階でサービスコンテナ、サービスプロバイダについてちょっと触れる機会があったので簡単に調べたことを今回は書いていこうと思います。
実際この部分はどうやらlaravelを使うにあたって大事な知識になるらしく、結構自分んで調べてみて完全に理解することは大変だったので、最低限のことだけ残しておきます。
サービスコンテナはDIコンテナとも言われて依存性の注入とかそこら辺理解してある前提のメモです。
サービスコンテナとは
まずサービスコンテナとはなにか。
いろいろ記事を見ていろんな説明があるのですが、意味していることは大体同じ感じなのでそのまんま書いてみます。
・Laravelで使用する様々な用途のインスタンスの生成方法を登録(バインド)しておいて、使用する際にサービスコンテナからインスタンスを生成して返すというプロセス。
・クラス(サービス)のインスタンス化を管理する仕組み。
・依存関係を解決するために行なっていた外部からの注入をまとめて担ってくれるのがサービスコンテナ。
処理の流れとしては
1:サービスコンテナにクラスを登録(バインド)
2:サービスコンテナからクラスを生成(リゾルブ)
バインドの種類
・Bindメソッド
・bindifメソッド
・singletonメソッド
・instanceメソッド
・Whenメソッド
バインドの種類は上記のような種類があるが、基本的な理解としてはサービスコンテナに登録するという理解で問題ないみたい。
class Sample{
public function doSomething() {
}
}
app()->bind(Sample::class, function () {
return new Sample();
}) // ⓵
$sample1 = app()->make(Sample::class); // ⓶
$sample1 -> doSomething();
⓵でbind処理をして、サービスコンテナに登録。
⓶でSampleクラスの解決をしています。
最後の1行でdoSomething()というメソッドを実行しています。
バインド(app->bind()) -> サービスコンテナ -> 解決(app->make())
サービスコンテナが提供されることによって
(1) テスト時にはアプリケーションコードで生成されるインスタンスをテスト用にすり替えるといったことができたり、
(2) あるインスタンスはアプリケーション実行プロセスで一つだけ(シングルトン)にしたいので、2回目の生成時には前回のインスタンスを返す。
といった操作が可能です。
理解と使い方はざっくりとこんな感じ。
ちなみにちょっと補足をすると、通常のDIコンテナではバインドが必要ですが、サービスコンテナのmakeメソッドでインスタンスを取得する際にクラス名を渡すと、事前にバインドしていなくてもクラスのインスタンスを取得することができます。
ちょっとユニットテストを書くタイミングで触ったくらいの知識なので完璧に理解したとは言えないレベルかもしれないが一旦こんな感じくらいに勉強してみたので今回はここまで。
おつかれ自分。