【问题标题】:Doctrine Entity Listeners not working if APP_DEBUG=false如果 APP_DEBUG=false,Doctrine 实体监听器不工作
【发布时间】:2022-01-06 10:19:36
【问题描述】:

关于教义实体侦听器,我有一个非常奇怪的行为。我在一个 symfony 4.4 应用程序中设置了两个学说实体监听器。

service.yaml 中的配置如下所示:

services:
    App\EntityListener\MyEntityListener:
        tags:
            -   name: doctrine.orm.entity_listener
                event: preUpdate
                entity: App\Entity\MyEntity

我遇到了问题,实体侦听器在本地开发环境中完美运行,但在生产环境中却不行。我已将问题跟踪到 symfony 调试模式。如果 symfony 内核有debug=true,实体监听器会按预期调用。如果设置为 false,实体侦听器由于某种原因不会按原则附加到实体类元数据。我的第一个猜测是缓存使用问题,但如果清除缓存,问题仍然存在。此外,我没有任何依赖于 Kernel::isDebug() 的客户端代码。

有没有人知道这个问题可能起源于哪里,并且可以提示我解决这个问题的方向?

【问题讨论】:

  • 也许在不同的环境中比较bin/console debug:event-dispatcher会带来一些启示
  • 如john所说,试试命令,不过加--env=<dev|test|prod>看看有没有区别
  • @johnSmith 感谢您的建议,但 AFAIK 学说实体侦听器未通过 symfony 事件调度程序组件注册。无论是否启用调试模式,我都没有在列表中看到实体侦听器。
  • @zedling 环境设置不会改变行为,改变仅来自 APP_DEBUG。

标签: php symfony doctrine


【解决方案1】:

经过数小时的搜索和调试,我找到了问题的根源。我在这个项目中使用了多个实体管理器。虽然实体侦听器绑定到一个实体管理器,但教义的类元数据缓存却没有。因此,当 debug 设置为 true 时,没有(真正的)缓存命中,并且类元数据始终是全新构建的。这保证了实体侦听器在需要时始终存在。 但是当使用缓存时,实体类元数据是在每个负责实体的实体管理器的上下文中构建的。但它仍然被写入同一个缓存存储。因此,如果第一个实体管理器在由另一个实体管理器管理的类上有一堆实体侦听器,则实体侦听器将在缓存条目中删除,因为元数据条目将被覆盖。

要解决此问题,需要更具体地了解哪些实体由哪个实体管理器管理。将实体侦听器专门附加到正确的实体管理器也可能会有所帮助。因为如果省略,实体侦听器仅附加到默认实体管理器,而不附加到任何其他实体管理器,在这种情况下,可能会发生此处描述的行为。

【讨论】:

    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    相关资源
    最近更新 更多