Symfony2 - 关于教义/ orm的听众

时间:2011-06-07 21:40:45

标签: symfony

在Symfony2 / Doctrine中插入记录后触发事件的最佳方法是什么?

2 个答案:

答案 0 :(得分:10)

首先,将服务注册为Doctrine事件监听器:

app/config.yml

services:
    foo.listener:
        class: Vendor\FooBundle\BarClass
        tags:
            - { name: doctrine.event_listener, event: postPersist, method: onPostPersist }

然后在您的侦听器类中,定义onPostPersist方法(或者您在配置中命名方法的任何方法),该方法采用Doctrine\ORM\Event\LifecycleEventArgs参数:

public function onPostPersist(LifecycleEventArgs $eventArgs)
{
    // do stuff with the entity here
}

请注意,您无法将EntityManager的实例传递给侦听器类,因为$ eventArgs包含对它的引用,这样做会抛出CircularReferenceException。

Doctrine项目文档here。 Symfony项目文档here(过时,但包含在内作为参考)/

答案 1 :(得分:1)

尝试注入容器本身而不是安全上下文。使用FOS_USER,security.context依赖于您的侦听器(EM),并且您的侦听器需要security.context。

<service id="foo.listener" class="%foo.listener.class%">
  <argument type="service" id="service_container"/>
  <tag name="doctrine.event_listener" event="postPersist" method="fooMethod" />
</service>

顺便说一句,至少在XML中,方法名称似乎不起作用,默认情况下它调用方法'postPersist'而忽略你给出的任何方法名称(fooMethod);如果YAML配置也是如此,请告诉我,否则我错了。