我试图注入模板服务,这就是我得到的。
<service id="myproject_notification.service.mail" class="%myproject_notification.service.mail.class%">
<argument type="service" id="mailer" />
<argument type="service" id="templating" />
</service>
如果我从依赖项中评论或删除模板服务,一切都运行良好。我看到了关于这个问题的老问题,但似乎我是目前唯一遇到这个问题的人。我做错了吗?
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",
答案 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