Laravel依赖注入无需依赖控制器

时间:2020-05-28 23:58:45

标签: laravel dependency-injection

我试图弄清楚如何将依赖项注入Laravel中的类。

我的结构:

SimpleController extends BaseController
{
    public function example(SimpleModel $model, SimpleValidationRequest $request)
    {
        $result = $model->doStuff()
        return $this->makeResponse($result);
    }
}

SimpleModel extends Model
{
    public function doStuff(ComplexService $service)
    {
        $service->doComplexLogic($this);
    }
}

我已经在自己的服务提供商中注册了ComplexService

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->singleton(ComplexService::class);
    }
}

我想将服务直接注入到simpleModel的doStuff方法中,而不必将其注入到控制器中,然后注入模型中。我们正忙于将一个单片应用程序移至Laravel,并拥有包含所有复杂业务逻辑的服务类。许多逻辑在不同类之间共享,因此控制器方法可能会调用一个模型,该模型最终调用对其他服务进行4或5次调用的服务,而我希望能够将另一个服务注入需要此服务的任何方法中无需将其从控制器一直发送到可能需要它的底部方法。

有没有办法做到这一点?我一直在网上寻找,但发现的所有内容都要求我将服务注入控制器,然后从那里通过应用程序发送它,这是我想避免的。

1 个答案:

答案 0 :(得分:0)

您可以简单地通过app()帮助器在方法内调用单例

SimpleModel extends Model
{
    public function doStuff(ComplexService $service)
    {
        app()->singleton(ComplexService::class)->doComplexLogic($this);
    }
}

或通过通过__construct()方法将其注入模型中来恢复单例。