【问题标题】:Laravel nested dependency injection - Maximum function nesting level of '256' reachedLaravel 嵌套依赖注入 - 达到“256”的最大函数嵌套级别
【发布时间】:2018-10-04 20:59:36
【问题描述】:

这是一个例子:

今天我遇到了一种情况,我需要将某个函数从 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;
    }
}

【问题讨论】:

    标签: laravel dependency-injection


    【解决方案1】:

    当 Laravel 容器用于创建对象的新实例时,它会检查这些对象的依赖关系,并从容器中注入绑定的实例,或者如果可以的话,更新新的实例。

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

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

    【讨论】:

    • 是的,我也在考虑创建一个单独的服务类。但是当我通过互联网搜索时发现类似这样的内容:github.com/symfony/symfony/pull/28512,它是否也与我的问题有关?抱歉,如果这是一个新手问题。
    猜你喜欢
    • 1970-01-01
    • 2019-11-27
    • 2019-03-23
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 2016-06-24
    • 2017-06-27
    • 1970-01-01
    相关资源
    最近更新 更多