2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laravel のメソッドインジェクションの注意点

Last updated at Posted at 2022-12-18

コンテキストによる使い分け

Laravelでは↑にあるように、サービスコンテナに登録されたクラスなら、依存注入する際にコンテキストによって注入されるインスタンスを変更することができます。
例えば、以下のコードなら、
VideoController::classUploadController::class にて、 Filesystem::class の依存解決をする場合に、 Storage::disk('s3') が注入されます。

.php
$this->app->when([VideoController::class, UploadController::class])
  ->needs(Filesystem::class)
  ->give(function () {
      return Storage::disk('s3');
  });   

メソッドインジェクションでは適用されないっぽい

ただし、これはコンストラクタの引数における依存解決でしか適用されないようで、
メソッドの引数における依存解決ではこちらのコンテキストの処理は無視されるようです。
上記のコードだと、

VideoController__construct(Filesystem $system) には Storage::disk('s3') が注入されるが、
VideoControllersomeMethod(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
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?