Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 4-服务循环引用异常_Php_Symfony_Symfony4 - Fatal编程技术网

Php Symfony 4-服务循环引用异常

Php Symfony 4-服务循环引用异常,php,symfony,symfony4,Php,Symfony,Symfony4,我目前正在将我们的Symfony应用程序移植到Symfony 4.3。我从文档中了解到,新的最佳实践不是执行$this->container->get('service_a'),而是使用依赖注入在构造函数中附加服务,如下所示: public function __construct(ServiceA $service_a) { $this->service_a = $service_a; } 我有两个服务,在某些函数中相互调用,ServiceA和S

我目前正在将我们的Symfony应用程序移植到Symfony 4.3。我从文档中了解到,新的最佳实践不是执行
$this->container->get('service_a')
,而是使用依赖注入在构造函数中附加服务,如下所示:

    public function __construct(ServiceA $service_a)
    {
        $this->service_a = $service_a;
    }
我有两个服务,在某些函数中相互调用,ServiceA和ServiceB。当我将ServiceA添加到ServiceB的构造函数时,我没有看到任何错误,但在将ServiceB添加到ServiceA的构造函数后,我收到以下错误:


(1/1) ServiceCircularReferenceException
Circular reference detected for service "App\Service\ServiceA", path: "App\Service\ServiceA -> App\Service\ServiceB -> App\Service\ServiceA".
(所有这些代码在Symfony 2中都没有问题)


我是否误解了新方法?我在这里使用DependencyInjection错误吗?

您需要打破循环依赖关系。A依赖于B而B依赖于A是没有意义的。您的设计中存在一些错误,使用更好的实践暴露了这个问题。这些服务必须相互依赖吗?我会说循环依赖可能表明设计有缺陷。是否有机会将这些服务中的一个(或两个)拆分成更小的部分,打破这个循环?有时,您需要从另一个服务中调用的功能实际上可以被称为“静态”功能。因此,就像类::myFunction()而不是$service->myFunction()(取决于函数的偏离方向)。如果您可以使它成为一个“静态”函数(只需添加“static”一词),那么您就不需要调用整个服务来访问它。不要忘记寻找其他使用该函数的地方,并切换到直接使用以下命令调用它:。。。在过去,它经常帮助我,也许它可以为你提供一个解决方案。为什么两个库想要彼此的功能是糟糕的设计?(到目前为止,这听起来像是一个任意的约束“仅仅因为”。)在S2/S3时代,服务容器将被注入到许多您自己的服务库中,每个服务库都通过容器请求其他服务,这是非常可以接受的。您需要打破循环依赖。A依赖于B而B依赖于A是没有意义的。您的设计中存在一些错误,使用更好的实践暴露了这个问题。这些服务必须相互依赖吗?我会说循环依赖可能表明设计有缺陷。是否有机会将这些服务中的一个(或两个)拆分成更小的部分,打破这个循环?有时,您需要从另一个服务中调用的功能实际上可以被称为“静态”功能。因此,就像类::myFunction()而不是$service->myFunction()(取决于函数的偏离方向)。如果您可以使它成为一个“静态”函数(只需添加“static”一词),那么您就不需要调用整个服务来访问它。不要忘记寻找其他使用该函数的地方,并切换到直接使用以下命令调用它:。。。在过去,它经常帮助我,也许它可以为你提供一个解决方案。为什么两个库想要彼此的功能是糟糕的设计?(到目前为止,这听起来像是一个任意的约束“仅仅因为”。)在S2/S3时代,服务容器将被注入到许多您自己的服务库中,每个服务库都通过容器请求其他服务,这是非常可以接受的。