2011-06-07 103 views

回答

10

首先,注册一个服务作为一种学说事件侦听器:

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实例传递给listene r类,因为$ eventArgs包含对它的引用,这样做会抛出CircularReferenceException。

学说项目文档here。 Symfony项目文档here(过时,但仅供参考)/

+0

我正在做这个完全相同的事情,但我试图在我的侦听器中包含对securityContext对象的引用。我在我的yml文件中添加了:arguments:[“@ security.context”],但是当我将$ securityContext对象添加到我的构造函数中时,出现循环引用错误。有任何想法吗?我正在使用FOSUserBundle,并在我收到的错误中显示。 – Jeremy 2011-09-26 19:35:09

+1

这是我收到的错误。 ServiceCircularReferenceException:检测到服务“security.context”的循环引用,路径:“profiler_listener - > profiler - > security.context - > security.authentication.manager - > fos_user.user_manager - > doctrine.orm.default_entity_manager - > doctrine.dbal。 default_connection - > my.listener“。 – Jeremy 2011-09-26 19:35:55

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配置的情况,或者我错了。