检测到服务的循环引用" security.context"

时间:2014-06-10 10:49:53

标签: symfony dependency-injection twig

我试图注入模板服务,这就是我得到的。

<service id="myproject_notification.service.mail" class="%myproject_notification.service.mail.class%">
    <argument type="service" id="mailer" />
    <argument type="service" id="templating" />
</service>

2014-06-10 12-37-10

如果我从依赖项中评论或删除模板服务,一切都运行良好。我看到了关于这个问题的老问题,但似乎我是目前唯一遇到这个问题的人。我做错了吗?

Composer.json

"symfony/symfony": "~2.4",
"twig/extensions": "~1.0",
"symfony/assetic-bundle": "~2.3",
"symfony/swiftmailer-bundle": "~2.3",
"symfony/monolog-bundle": "~2.4",
"sensio/distribution-bundle": "~2.3",
"sensio/framework-extra-bundle": "~3.0",
"sensio/generator-bundle": "~2.3",
"incenteev/composer-parameter-handler": "~2.0",

Composer.lock

"name": "symfony/symfony",
"version": "v2.5.0",
...
"name": "twig/twig",
"version": "v1.15.1",

3 个答案:

答案 0 :(得分:10)

您应该始终尽量避免将容器直接注入您的服务。

我认为“循环引用”问题以及可能的性能问题的最佳解决方案是使用从Symfony 2.3开始提供的«Lazy Services»功能。

在服务容器配置中将依赖项标记为lazy并安装ProxyManager Bridge(查看上面的Lazy Services文档中的详细信息)。

我希望有所帮助,欢呼。

答案 1 :(得分:7)

此解决方案是解决问题的快捷方法。这可以避免,请阅读评论。

对于这种特殊情况,最好将ServiceContainer注入您的服务。由于您似乎遇到了一个边缘情况,security.context已经注入到某些templating服务(例如帮助程序)中,然后在您的示例中(间接)注入{{1 }}。

试试这个:

security.context

在你班级的构造函数中,按如下方式使用它:

<service id="myproject_notification.service.mail" class="%myproject_notification.service.mail.class%">
    <argument type="service" id="service_container" />
</service>

请参阅Symfony Core开发人员之间关于同一问题的对话: https://github.com/symfony/symfony/issues/2347

对于大多数情况,为several reasons注入服务容器 不建议

答案 2 :(得分:0)

composer require symfony/proxy-manager-bridge

这就是您解决此问题的方法。

检查Symfony Docs以获得更多信息。...

请不要忘记使用设置服务:

lazy : true