質問: $userRepository; } } ``` UserServiceクラスでは、UserRepositoryクラスをコンストラクタインジェクションしています。 このUserServiceクラスを、コントローラでメソッドインジェクションしたいのですが、コンストラクタで引数をとっているため、うまくいきません。 ``` class UserController extends Controller { public function create(UserService $userService) { // ここでuserServiceを使用したい。 } } ``` なにか良い方法はありますでしょうか? UserServiceクラスでUserRepositoryはDIして使用したいです。 そもそもコンストラクタインジェクションはあまり使用しないのでしょうか? ベストプラクティスみたいなものがあれば教えていただきたく思います。 よろしくお願いいたします。
回答: LaravelのDIにはサービスコンテナの理解が必要。 ドキュメント読んでもらうとして どうすればいいかはAppServiceProviderでサービスコンテナに登録。 ``` public function register() { $this->app->singleton(UserService::class, function ($app) { return new UserService(new UserRepository); }); } ``` DIはどこでも使えるわけではなくLaravelが裏側でやってくれてる箇所のみ。 UserServiceはLaravelとは関係ないのでどう初期化するかは自分でAppServiceProviderで指定。 create(UserService $userService) →UserServiceをサービスコンテナから探す →なければ普通にnew UserService→UserRepositoryがないのでエラー。 →あればサービスコンテナに従い`new UserService(new UserRepository)`を返す。 正確な所は中身見てもらうしかないけどこのようなことを裏側でやっている。