コンテキストによる使い分け
Laravelでは↑にあるように、サービスコンテナに登録されたクラスなら、依存注入する際にコンテキストによって注入されるインスタンスを変更することができます。
例えば、以下のコードなら、
VideoController::class
か UploadController::class
にて、 Filesystem::class
の依存解決をする場合に、 Storage::disk('s3')
が注入されます。
$this->app->when([VideoController::class, UploadController::class])
->needs(Filesystem::class)
->give(function () {
return Storage::disk('s3');
});
メソッドインジェクションでは適用されないっぽい
ただし、これはコンストラクタの引数における依存解決でしか適用されないようで、
メソッドの引数における依存解決ではこちらのコンテキストの処理は無視されるようです。
上記のコードだと、
VideoController
の __construct(Filesystem $system)
には Storage::disk('s3')
が注入されるが、
VideoController
の someMethod(Filesystem $system)
には 注入されず、 Filesystem::class
がそのまま使われます。
もちろん、 Filesystem::class
が抽象クラスであれば someMethod(Filesystem $system)
が呼ばれれば読み込みエラーになります。
検証環境
Laravel Framework 9.16.0
PHP 8.0.22 (cli) (built: Aug 4 2022 22:25:40) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.22, Copyright (c) Zend Technologies