在使用symfony-flex…将symfony3.4项目迁移到…的过程中
在调整目录结构并进行少量调整之后,我现在面临的是在应用程序服务容器引导阶段出现的类似于循环依赖错误。点击应用程序(无论是从控制台还是从前端)会引发一些与X调试相关的异常,说嵌套函数调用达到了(‘256’)。
回顾一下回溯,发现了一种重复自己的模式,并得出结论,Xdebug不是罪魁祸首,而是,两个服务间接地依赖于彼此的。
涉及的服务包括:
反向跟踪(请自下而上阅读)
==== ↑↑ 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类无法将其底层实体对象本身持久化到数据库,因此将该作业委托给调用上下文,方法是返回要持久化的实例。不过,我不相信这是理想的解决办法。
建议的办法将是非常感谢的。
谢谢。
发布于 2018-04-04 13:23:21
用方法调用替换依赖项注入参数确实解决了这个问题。我的log_manager服务定义现在如下所示:
log_manager:
class: Service\Log\LogManager
public: true
arguments:
- "@?security.token_storage"
calls:
- ['setEntityManager', ["@doctrine.orm.entity_manager"]]如果有更好的方法解决这个问题,请评论/回答。
https://stackoverflow.com/questions/49554736
复制相似问题