Symfony4服务容器圆依赖性



在将Symfony3.4项目迁移到Symfony4的过程中

调整目录结构并进行几次调整后,我现在面对看起来像圆形依赖关系错误在应用程序服务容器引导阶段中出现的错误。击中应用程序(无论是从控制台还是前面(提出一些与 xdebug «嵌套函数调用限制的例外('256'(»。。

查看回溯揭示了一种重复自我的模式,并得出这样的结论: xdebug 不是要怪的一种模式,而是两种服务,这是间接取决于每个人的是。

涉及的服务是:

  • 日志管理器是一项公共服务,可帮助将用户操作持续到数据库:

    log_manager:
        class: ServiceLogLogManager
        public: true
        arguments:
            - "@doctrine.orm.entity_manager"
            - "@?security.token_storage"
    
  • loggablesubscriber 消耗 logmanager 服务在某些应用程序对象状态变化时创建新记录:

    DoctrineBehaviorORMLoggableLoggableSubscriber:
        public: false
        arguments:
            - "@log_manager"
            - "@event_dispatcher"
        tags:
            - { name: doctrine.event_subscriber }
    

backtrace (请从下到顶部阅读(

==== ↑↑ 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 class无法将其基本的实体对象自行持续到数据库中,并因此而持续下去通过返回实例持续存在的实例,将该作业委托给呼叫上下文。我不相信这是理想的解决方案。

建议的方法真的将不胜感激。
谢谢。

用方法调用替换依赖性注入参数确实解决了问题。我的log_manager服务定义现在看起来像这样:

log_manager:
    class: ServiceLogLogManager
    public: true
    arguments:
        - "@?security.token_storage"
    calls:
        - ['setEntityManager', ["@doctrine.orm.entity_manager"]]

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

最新更新