Symfony 2.6中的Doctrine Entity Listener

Jea*_*ean 1 doctrine symfony entitylisteners

根据如何使用Sytrfony 2.4的Doctrine Entity Listener?在Symfony中设置实体监听器功能应该非常简单.

不幸的是,我的听众nevers被召唤,我不知道为什么.我已经检查了doctrine包的编译器传递以及DefaultEntityListenerResolver类.我的监听器被传递给寄存器方法,然后应该可用.另一方面,解决方法似乎从未被调用过.

这是我的服务定义:

insite.entity.listener.page_node:
    class: NutCase\InSiteBundle\Entity\PageNodeListener
    tags:
        - { name: doctrine.orm.entity_listener }
Run Code Online (Sandbox Code Playgroud)

这是我的倾听者:

namespace NutCase\InSiteBundle\Entity;

use Doctrine\ORM\Event\LifecycleEventArgs;

class PageNodeListener
{
    public function prePersist( PageNode $node, LifecycleEventArgs $event )
    {
        die("okay");
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里我的实体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
Run Code Online (Sandbox Code Playgroud)

我已经在YAML中添加了一个"entityListeners"条目,因为我认为这个条目丢失了:

entityListeners:
  - PageNodeListener // Also tried the full namespace
Run Code Online (Sandbox Code Playgroud)

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

[Symfony\Component\Debug\Exception\ContextErrorException]  
  Warning: Invalid argument supplied for foreach()   
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Jea*_*ean 5

我刚刚找到解析YAML的代码以及entityListeners键:YamlDriver.由于我没有找到任何关于此密钥的YAML配置的文档,我必须检查代码,这导致我得到的答案是实体监听器的正确YAML标记应该是:

Your\Entity\Namespace:
  entityListeners:
    Path\To\Your\Listener: ~
Run Code Online (Sandbox Code Playgroud)

如果要将特定方法映射到特定事件,则应使用:

Your\Entity\Namespace:
  entityListeners:
    Path\To\Your\Listener:
       prePersist: [methodOnYourListener]
Run Code Online (Sandbox Code Playgroud)

如果有任何文件,猜猜问题就是针.

我还想指出,您不必将您的听众注册为服务.实体的YAML映射中的类名实际上足以让它运行,因为DefaultEntityListenerResolver将创建一个实例(如果还没有).如果您有其他依赖项,则只需将侦听器注册为服务,例如安全上下文.