【问题标题】:Doctrine Entity Listener in Symfony 2.6Symfony 2.6 中的 Doctrine 实体监听器
【发布时间】:2015-01-21 13:22:15
【问题描述】:

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

不幸的是,我的听众从来没有被叫过,我不知道为什么。我检查了学说包的编译器传递以及 DefaultEntityListenerResolver 类。我的侦听器被传递给 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()   

有什么建议吗?

【问题讨论】:

    标签: symfony doctrine entitylisteners


    【解决方案1】:

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

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

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

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

    如果有任何文档,我猜这个问题会很棘手。

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

    【讨论】:

    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多