11

我已按照本教程中的说明进行操作: http: //symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html,并创建了一个简单的侦听器,用于侦听 Doctrine 在插入或更新实体时调度的事件. preInsert 和 postInsert 事件工作正常,并在创建新实体时分派。但是,无论如何,在实体的更新上都不会调用 preUpdate 和 postUpdate。onFlush 也是如此。作为旁注,我有一个控制台生成的控制器,它支持基本的 CRUD 操作,并且保持不变。

下面是一些代码片段来演示我这样做的方式。

配置.yml

annotation.listener:
    class: City\AnnotatorBundle\Listener\AnnotationListener
    tags:
        -  { name: doctrine.event_listener, event: postUpdate}

监听器实现(为了简单起见,我省略了其他函数,只留下了 postUpdate)

class AnnotationListener
{

    public function postUpdate(LifecycleEventArgs $args)
    {
        $entity=$args->getEntity();

        echo $entity->getId();
        die;
    }
}

实体 id 永远不会显示,并且脚本会继续执行直到它完成,尽管函数结束时死亡。

4

1 回答 1

15

你忘了加@HasLifecycleCallbacks注解吗?您可以使用@PreUpdate注释并完全跳过服务定义。

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class YouEntity
{

    /**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function preUpdate(){
        // .... your pre-update logic here
    }
    ....
}

在我看来,这种附加事件的方式要容易得多,因为您不必明确定义新的服务和侦听器。此外,您还可以直接访问正在更新的数据,因为此方法是您实体中的位置。

现在,缺点是您将逻辑与模型混合在一起,如果可能的话,应该避免这种情况......

您可以在此处阅读有关生命周期回调的更多信息:http: //symfony.com/doc/master/cookbook/doctrine/file_uploads.html#using-lifecycle-callbacks

于 2012-04-28T09:54:35.473 回答