在Symfony2 / Doctrine中插入记录后触发事件的最佳方法是什么?
答案 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。
答案 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配置也是如此,请告诉我,否则我错了。