Laravel嵌套依赖项注入-达到最大功能嵌套级别“ 256”

时间:2018-10-04 10:40:10

标签: laravel dependency-injection

这里是一个例子:

今天,我遇到了一种情况,我需要从ServiceA到ServiceB调用某些函数,但同样需要其他方法。 Laravel有什么问题吗,或者我在依赖注入方面做了一些不好的练习?

我添加了一个示例示例,该示例在某种程度上类似于我的实际代码库。如果我缺少什么,请回复。

谢谢!

控制器:

class ExampleController extends Controller
{

    private $serviceA;
    private $serviceB;

    public function __construct(
        ServiceA $serviceA,
        ServiceB $serviceB
    )
    {
        $this->serviceA = $serviceA;
        $this->serviceB = $serviceB;
    }
}

服务A:

class ServiceA
{

    private $serviceB;

    public function __construct(ServiceB $serviceB)
    {
        $this->serviceB = $serviceB;
    }
}

服务B:

class ServiceB
{
    private $serviceA;

    public function __construct(ServiceA $serviceA)
    {
        $this->serviceA = $serviceA;
    }
}

1 个答案:

答案 0 :(得分:1)

使用Laravel容器创建对象的新实例时,它会检查那些对象的依赖性,并从容器中注入绑定的实例,或者在可能的情况下通知新实例。

在这种情况下,当Laravel尝试创建控制器的新实例时,它将看到它需要ServiceA。如果ServiceA未绑定在容器中,它将尝试创建一个新实例。因此,它将检查ServiceA的依赖项,并确定它需要ServiceB。如果ServiceB未绑定在容器中,它将尝试创建一个新实例。因此,它将检查ServiceB的依赖项,并确定它需要ServiceA。如果ServiceA未绑定在容器中,它将尝试创建一个新实例。因此,它将检查ServiceA的依赖项,并确定它需要ServiceB。如果ServiceB未绑定在容器中,它将尝试创建一个新实例。因此,它将检查ServiceB的依赖项,并确定它需要ServiceA。如果ServiceA未绑定在容器中,它将尝试创建一个新实例……您明白了。

通常,当您有两个彼此依赖的类时,这意味着每个类中都有可能属于第三(或第四...)类的功能。如果可以,请尝试识别此功能并将其拆分为ServiceA和ServiceB都依赖的ServiceC,而不是彼此分开。