Symfony preUpdate vs prePersist

时间:2013-01-15 19:47:35

标签: symfony doctrine-orm

我是Symfony2的新手,我想知道prePersist和preUpdate事件有什么不同。看起来prePersist在我'坚持'一条记录之前被“解雇”,但是什么时候更新了?

3 个答案:

答案 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字段已更新。

- 您可以为PrePersistPreUpdate

设置多个生命周期回调注释

因此,例如,如果要在创建记录和更新记录时设置修改时间戳,可以将两个注释添加到实体中的同一功能,例如,

/**
 * @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。