Symfony 2.6 中的 Doctrine 实体监听器

Doctrine Entity Listener in Symfony 2.6

根据 How to use Doctrine Entity Listener with Symfony 2.4? 在 Symfony 中设置实体侦听器功能应该非常简单。

不幸的是,我的监听器从未被调用过,我也不知道为什么。我已经检查了 doctrine bundle 的编译器传递以及 DefaultEntityListenerResolver class。我的监听器被传递给 register 方法,然后应该可用。另一方面,resolve 方法似乎从未被调用过。

这是我的服务定义:

insite.entity.listener.page_node:
    class: NutCase\InSiteBundle\Entity\PageNodeListener
    tags:
        - { name: doctrine.orm.entity_listener }

这是我的听众:

namespace NutCase\InSiteBundle\Entity;

use Doctrine\ORM\Event\LifecycleEventArgs;

class PageNodeListener
{
    public function prePersist( PageNode $node, LifecycleEventArgs $event )
    {
        die("okay");
    }
}

这是我的实体 yaml:

NutCase\InSiteBundle\Entity\PageNode:
    type: entity
    table: page_node
    repositoryClass: NutCase\InSiteBundle\Entity\PageNodeRepository

    fields:
        title:
            type: string
            length: 255
            nullable: false

        segment:
            type: string
            length: 255
            nullable: false

        url:
            type: string
            length: 255
            nullable: false

        root:
            type: boolean
            nullable: false

        hidden:
            type: boolean
            nullable: false

我在 YAML 中添加了一个 "entityListeners" 条目,因为我认为缺少这个条目:

entityListeners:
  - PageNodeListener // Also tried the full namespace

每当我尝试加载 PageNode 实体时只会导致以下错误:

[Symfony\Component\Debug\Exception\ContextErrorException]  
  Warning: Invalid argument supplied for foreach()   

有什么建议吗?

我刚刚找到解析 YAML 和 entityListeners 键的代码:YamlDriver。由于我找不到此密钥的 YAML 配置的任何文档,因此我不得不检查代码,这让我得到了实体侦听器的正确 YAML 标记应该是的答案:

Your\Entity\Namespace:
  entityListeners:
    Path\To\Your\Listener: ~

如果您想将特定方法映射到特定事件,您应该使用:

Your\Entity\Namespace:
  entityListeners:
    Path\To\Your\Listener:
       prePersist: [methodOnYourListener]

如果有相关文件的话,我猜这个问题应该是针。

我还想指出,您不必将侦听器注册为服务。实体的 YAML 映射中的 class 名称实际上足以获取它 运行,因为如果还存在 none,DefaultEntityListenerResolver 将创建一个实例。如果您有其他依赖项,例如安全上下文,则只需将侦听器注册为服务。