【问题标题】:Symfony 3.4 - Circular reference detected for serviceSymfony 3.4 - 检测到服务的循环引用
【发布时间】:2018-04-14 23:54:55
【问题描述】:

我正在将我的项目从 Symfony 2.7 迁移到 3.4,并且在执行一些 Doctrine 固定装置时遇到了问题。正如标题所说,我收到此错误

Error thrown while running command "doctrine:fixtures:load --append". Message: "Circular reference detected for service "service_2", path: "service_2"." ["error" => Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException { …},"command" => "doctrine:fixtures:load --append","message" => "Circular reference detected for service "service_2", path: "service_2"."] []

当我尝试使用服务容器获取服务时,该服务容器已经注入到另一个使用的服务中。场景如下所示:

service_1:
  class: Acme\BusinessBundle\ServiceOne
  arguments: ["@service_2"]
  public: true
  tags:
    - { name: monolog.logger, channel: s1 }

service_2:
  class: Acme\BusinessBundle\ServiceTwo
  arguments: ["@doctrine.orm.default_entity_manager", "@logger"]
  public: true
  tags:
    - { name: monolog.logger, channel: s2 }

然后在固定装置中我只是这样做

$s1 = $this->container->get('service_1');
$s2 = $this->container->get('service_2');

获取异常。

但非常奇怪的是,我第二次收到service_2 时出现异常。所以基本上在第一个夹具中我得到两个服务没有任何问题,但是一旦第二个夹具启动并创建$s2,我就会得到ServiceCircularReferenceException(使用xdebug检查)。当然,我对 Symfony 2.7 没有任何问题。

那为什么我第一次没有得到任何异常?为什么我第二次得到它?有什么想法吗?

【问题讨论】:

  • 这行是哪个文件? $s1 = $this->container->get('service_1'); $s2 = $this->container->get('service_2'); 还是您将 service_1 带入 service_2 课程?
  • 所有灯具都位于BusinessBundle/DataFixtures/ORM

标签: php symfony exception doctrine-orm


【解决方案1】:

将整个容器传递给服务,然后在其中获取所需的服务。 这发生在我身上好几次了,我总是能够通过改变依赖注入来修复它。

【讨论】:

  • 我知道,我什至可以在ServiceOne 中创建一个getter 来获取ServiceTwo,但实际上我无法弄清楚为什么第一个夹具它可以工作,然后从第二个夹具它就不行。 .
  • 更多信息在这里github.com/symfony/symfony/issues/2347来自第二条评论“问题是每个服务都需要在创建自己之前创建另一个服务。”
  • 我不认为这是我的情况:ServiceTwo 不需要 ServiceOne - 只有 ServiceOne 需要 ServiceTwo
  • 这种情况发生在我身上的时候,导致循环的服务不是我创建的服务,而是应用程序中广泛使用的其他一些标准服务。例如 Twig 或 Doctrine。
  • 我也是这么想的,但我还是不明白为什么它第一次起作用。它也再次发生在我身上,但它根本不起作用,而这次它似乎部分起作用..
猜你喜欢
  • 1970-01-01
  • 2016-12-15
  • 2017-04-06
  • 2023-04-03
  • 2020-01-21
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多