tom*_*mor 9 events doctrine symfony
我已按照本教程中的说明操作:http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html,并创建了一个简单的侦听器,用于侦听Doctrine在插入或更新实体时调度的事件.preInsert和postInsert事件工作正常,并在创建新实体时调度.但是,无论如何都不会在实体更新时调用preUpdate和postUpdate.onFlush也是如此.作为旁注,我有一个控制台生成的控制器,支持基本的CRUD操作,并保持不变.
下面是一些代码片段,用于演示我这样做的方式.
config.yml
annotation.listener:
class: City\AnnotatorBundle\Listener\AnnotationListener
tags:
- { name: doctrine.event_listener, event: postUpdate}
Run Code Online (Sandbox Code Playgroud)
监听器实现(为了简单起见,我省略了其他函数并只留下了postUpdate)
class AnnotationListener
{
public function postUpdate(LifecycleEventArgs $args)
{
$entity=$args->getEntity();
echo $entity->getId();
die;
}
}
Run Code Online (Sandbox Code Playgroud)
永远不会显示实体ID,并且脚本会继续执行直到它完成,尽管函数结束时会死掉.
Jov*_*vic 13
你忘记添加@HasLifecycleCallbacks注释了吗?您可以使用@PreUpdate注释并完全跳过服务定义.
/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class YouEntity
{
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function preUpdate(){
// .... your pre-update logic here
}
....
}
Run Code Online (Sandbox Code Playgroud)
在我看来,这种附加事件的方式要容易得多,因为您不必明确定义新的服务和侦听器.您还可以直接访问要更新的数据,因为此方法是您实体中的位置.
现在,缺点是你将逻辑与模型混合在一起,如果可能的话应该避免......
您可以在此处阅读有关Lifecycle回调的更多信息:http: //symfony.com/doc/master/cookbook/doctrine/file_uploads.html#using-lifecycle-callbacks