在同一个实体中,我有一个PreUpdate和一个PrePersist。触发PreUpdate,但PrePersist永远不会发生。我在生命周期回调中的刷新和注释之后放了一个die()
。可以在http://pastebin.com/yUk1u4GQ
实体回调
/**
* @PreUpdate
*/
public function fixDates(){
$this->updatedOn = $this->getNow();
$this->closedDate = null;
$this->openDate = null;
print "dates fixed";
}
/**
* @PrePersist
*/
public function prePersist() {
print 'in prePersist';
die();
}
实体经理致电
$em->persist($school);
$em->flush();
die();
我的屏幕显示“已修复日期”,但不会显示prePersist消息。我确实在实体的顶部有@HasLifecycleCallbacks
。
答案 0 :(得分:57)
不要忘记在类注释中启用Lifecycle Callback:
/**
* Report\MainBundle\Entity\Serveur
* @ORM\HasLifecycleCallbacks
*/
class Serveur {
答案 1 :(得分:36)
PrePersist仅在您执行INSERT
语句而非UPDATE
语句时被解雇。
测试时,不要忘记只有在实体属性真正发生变化时才会触发UPDATE
语句。如果正在调用实体管理器以持久保存该实体,则它首先查看是否存在任何更改。如果没有,则不执行sql查询,也不调用@PreUpdate
方法。
答案 2 :(得分:11)
我知道这个问题差不多已有两年了,但我遇到了完全相同的问题,因为我没有接受一个接受的答案,我想分享其他人忘记提及的最后一件事。
虽然看起来触发的方法只能由实体类本身使用,但它的范围应该保持公开。我的方法不是因为我将其标记为受保护的方法而触发。我希望这会对某人有所帮助。
答案 3 :(得分:5)
我遇到了同样的问题。希望这可以帮到你:
我忘了使用use语句导入注释。如果你试试这个,别忘了添加“ORM”前缀:
use Doctrine\ORM\Mapping as ORM;
// ...
/**
* @ORM\PreUpdate
*/
public function preUpdate()
{
}
答案 4 :(得分:3)
也许它依赖于版本,但我的工作注释有下一个视图:
生命周期类注释:
/**
* @Entity @Table(name="table_name")
* @HasLifecycleCallbacks
**/
事件注释:
/** @PrePersist **/
/** @PreUpdate **/
这就是我在Model中所拥有的一切。