首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony4服务容器循环依赖

Symfony4服务容器循环依赖
EN

Stack Overflow用户
提问于 2018-03-29 11:18:23
回答 1查看 720关注 0票数 0

在使用symfony-flex…将symfony3.4项目迁移到…的过程中

在调整目录结构并进行少量调整之后,我现在面临的是在应用程序服务容器引导阶段出现的类似于循环依赖错误。点击应用程序(无论是从控制台还是从前端)会引发一些与X调试相关的异常,说嵌套函数调用达到了(‘256’)。

回顾一下回溯,发现了一种重复自己的模式,并得出结论,Xdebug不是罪魁祸首,而是,两个服务间接地依赖于彼此的

涉及的服务包括:

  • 日志管理器是帮助将用户操作持久化到数据库的公共服务: log_manager: class: Service\Log\LogManager public:真参数:- "@doctrine.orm.entity_manager“- "@?security.token_storage”
  • 当某些应用程序对象状态更改时,LoggableSubscriber使用LogManager服务来创建新记录: Doctrine\Behavior\ORM\Loggable\LoggableSubscriber:公共:假参数:- "@log_manager“- "@event_dispatcher”标记:-{ name: doctrine.event_subscriber }

反向跟踪(请自下而上阅读)

代码语言:javascript
复制
==== ↑↑ PATTERN REPEATS ON AND ON ↑↑ ====
==== ONCE AGAIN DOCTRINE LOOKS FOR SUBSCRIBERS ====
at boDevDebugProjectContainer->load('…/var/cache/bo/dev/ContainerTv5AUyL/getLoggableSubscriberService.php')
    in getDoctrine_Dbal_ApiacmeConnectionService.php (line 34)
at require('…/var/cache/bo/dev/ContainerTv5AUyL/getDoctrine_Dbal_ApiacmeConnectionService.php')
    in boDevDebugProjectContainer.php (line 446)
at boDevDebugProjectContainer->load('…/var/cache/bo/dev/ContainerTv5AUyL/getDoctrine_Dbal_ApiacmeConnectionService.php')
    in getDoctrine_Orm_ApiacmeEntityManagerService.php (line 74)
at require('…/var/cache/bo/dev/ContainerTv5AUyL/getDoctrine_Orm_ApiacmeEntityManagerService.php')
    in boDevDebugProjectContainer.php (line 446)
==== "LOGMANAGER" NATURALLY REQUIRES DOCTRINE ENTITY MANAGER SERVICE ====
at boDevDebugProjectContainer->load('…/var/cache/bo/dev/ContainerTv5AUyL/getDoctrine_Orm_ApiacmeEntityManagerService.php')
    in getLogManagerService.php (line 10)
at require('…/var/cache/bo/dev/ContainerTv5AUyL/getLogManagerService.php')
    in boDevDebugProjectContainer.php (line 446)
at boDevDebugProjectContainer->load('…/var/cache/bo/dev/ContainerTv5AUyL/getLogManagerService.php')
    in getLoggableSubscriberService.php (line 11)

==== BUT OUR "LOGGABLESUBSCRIBER" IN TURN NEEDS THE "LOGMANAGER" SERVICE ====
at require('…/var/cache/bo/dev/ContainerTv5AUyL/getLoggableSubscriberService.php')
    in boDevDebugProjectContainer.php (line 446)

==== DOCTRINE LOADS SUBSCRIBERS (ATTACHED VIA "TAG" PROPERTY) ====
at boDevDebugProjectContainer->load('…/var/cache/bo/dev/ContainerTv5AUyL/getLoggableSubscriberService.php')
    in getDoctrine_Dbal_ApiacmeConnectionService.php (line 34)
==== ↑↑ PATTERN STARTS HERE ↑↑ ====

at require('…/var/cache/bo/dev/ContainerTv5AUyL/getDoctrine_Dbal_ApiacmeConnectionService.php')
    in boDevDebugProjectContainer.php (line 446)
at boDevDebugProjectContainer->load('…/var/cache/bo/dev/ContainerTv5AUyL/getDoctrine_Dbal_ApiacmeConnectionService.php')
    in getDoctrine_Orm_ApiacmeEntityManagerService.php (line 74)
at require('…/var/cache/bo/dev/ContainerTv5AUyL/getDoctrine_Orm_ApiacmeEntityManagerService.php')
    in boDevDebugProjectContainer.php (line 446)

==== FIRST, OUR "LOGMANAGER" SERVICE DEPENDS ON DOCTRINE MAIN ENTITYMANAGER ====
at boDevDebugProjectContainer->load('…/var/cache/bo/dev/ContainerTv5AUyL/getDoctrine_Orm_ApiacmeEntityManagerService.php')
    in getLogManagerService.php (line 10)
at require('…/var/cache/bo/dev/ContainerTv5AUyL/getLogManagerService.php')
    in boDevDebugProjectContainer.php (line 446)
↑↑ ↑↑ ↑↑
…

,这纯粹是一个误解的问题吗?或者通过在配置中设置一些属性/标志来让服务容器意识到这种情况,这样就不会发疯了吗?,我看到了几个与这个主题相关的问题,但是答案是特定于问题的上下文的。

我即将打破LogManager服务对原则的实体管理器的依赖,使LogManager类无法将其底层实体对象本身持久化到数据库,因此将该作业委托给调用上下文,方法是返回要持久化的实例。不过,我不相信这是理想的解决办法。

建议的办法将是非常感谢的。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-04 13:23:21

用方法调用替换依赖项注入参数确实解决了这个问题。我的log_manager服务定义现在如下所示:

代码语言:javascript
复制
log_manager:
    class: Service\Log\LogManager
    public: true
    arguments:
        - "@?security.token_storage"
    calls:
        - ['setEntityManager', ["@doctrine.orm.entity_manager"]]

如果有更好的方法解决这个问题,请评论/回答。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49554736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档