如果 APP_DEBUG=false,Doctrine Entity Listeners 不工作

Doctrine Entity Listeners not working if APP_DEBUG=false

关于学说实体听众,我有一个非常奇怪的行为。我在 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().

的客户端代码

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

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

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