我是Symfony2的新手,我想知道prePersist和preUpdate事件有什么不同。看起来prePersist在我'坚持'一条记录之前被“解雇”,但是什么时候更新了?
答案 0 :(得分:23)
这些都不是Symfony的一部分。它们是Doctrine2的一部分。 prePersist 会在实体首次持久化时触发。持久化对象意味着它由Doctrine entityManager管理,即使在刷新之前它实际上并未插入到数据库中。
preUpdate 是即将更新的现有对象上的相应事件。由于现有对象在查询时已由entityManager管理,因此没有等效的持久性事件。它基本上是在现有对象被更改时触发,并且已经调用了刷新。
换句话说,如果您没有更改对象中的任何内容,则PreUpdate将无法运行!
话虽如此,您可以将这些视为“插入前”和“更新前”。
还有两种形式:生命周期回调,可以直接注释到实体中并作为方法添加到其中,但只能访问实体属性。这些对于简单的操作很有用,例如时间戳,符合特定标准的字符串或生成派生属性。
还有真正的事件侦听器,它们必须在entityManager中注册,并且可以访问具有数据库触发器中您期望的数据之前/之后类型的事件数据。
请注意,在Doctrine version 2.4 they added event Data even for Lifecycle callbacks中,现在可以更简单,更容易地执行您之前需要使用事件侦听器的相同类型的事物。
答案 1 :(得分:15)
另外值得注意的是:
- 如果您的实体没有任何更改的值,PreUpdate
将不会触发。
因此,无论何时保存表单,您都不能依赖于此更新修改时间戳。如果您在一个页面上有一组表单,并且用户可能已更新包含的子表单集合的某些字段,则这尤其棘手。已更新的实体将触发PreUpdate
,但主要表单实体不会触发PreUpdate
,除非它的OWN字段已更新。
- 您可以为PrePersist
和PreUpdate
因此,例如,如果要在创建记录和更新记录时设置修改时间戳,可以将两个注释添加到实体中的同一功能,例如,
/**
* @ORM\PreUpdate
* @ORM\PrePersist
*/
public function setTimeModValue() {
$this->timeMod = time();
}
答案 2 :(得分:5)
从这里开始:http://docs.doctrine-project.org/en/2.0.x/reference/events.html#lifecycle-events
prePersist - 在执行该实体的相应EntityManager持久操作之前,对于给定实体发生prePersist事件。
preUpdate - preUpdate事件发生在对实体数据的数据库更新操作之前。它不是为DQL UPDATE语句调用的。
另外,请注意这是针对Doctrine的,而不是Symfony。