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 将创建一个实例。如果您有其他依赖项,例如安全上下文,则只需将侦听器注册为服务。
根据 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 将创建一个实例。如果您有其他依赖项,例如安全上下文,则只需将侦听器注册为服务。