13

我是 Symfony2 的新手,我想知道 prePersist 和 preUpdate 事件有什么区别。看起来 prePersist 在我“保留”记录之前被“解雇”,但是 preUpdate 什么时候触发?

4

3 回答 3

32

这些都不是 Symfony 的一部分。它们是 Doctrine2 的一部分。prePersist在实体第一次被持久化时触发持久化一个对象意味着它是由 Doctrine entityManager 管理的,即使它在 flush 之前实际上并没有被插入到数据库中

preUpdate是即将更新的现有对象上的相应事件。因为现有对象在被查询时已经由 entityManager 管理,所以没有等效的持久事件。它基本上在现有对象已更改并且已调用刷新时触发。

换句话说,如果您没有更改对象中的任何内容,PreUpdate 将不会运行!

话虽如此,您可以将这些视为“就在插入之前”和“就在更新之前”发生的事情。

它们也有两种形式: 生命周期回调,可以直接注释到实体中并作为方法添加到其中,但只能访问实体属性。这些可以很好地用于简单的操作,例如时间戳、使字符串符合特定标准或生成派生属性。

还有真正的事件侦听器必须在 entityManager 中注册,并且可以访问具有您期望在数据库触发器中的前/后数据类型的事件数据。

请注意,在Doctrine 版本 2.4 中,他们甚至为 Lifecycle callbacks 添加了事件数据,这使得执行以前使用事件侦听器所需的相同类型的事情变得更加简单和容易。

于 2013-01-15T20:05:52.520 回答
18

另外值得注意的是:

-如果您的实体没有任何更改的值,PreUpdate则不会触发。

因此,您不能仅仅依靠它来在保存表单时更新修改时间戳。如果您在一个页面上有一组表单,并且用户可能已经更新了包含的子表单集合的某些字段,这将特别棘手。已更新的实体将触发PreUpdate,但主要表单实体不会触发 a PreUpdate,除非它的 OWN 字段已更新。

-您可以为两者设置多个生命周期回调注释PrePersistPreUpdate

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

/**
 * @ORM\PreUpdate
 * @ORM\PrePersist
 */
public function setTimeModValue() {
    $this->timeMod = time();
}
于 2014-06-14T01:16:52.007 回答
5

从这里:http ://docs.doctrine-project.org/en/2.0.x/reference/events.html#lifecycle-events

prePersist - 在执行该实体的相应 EntityManager 持久操作之前,该实体发生 prePersist 事件。

preUpdate - preUpdate 事件发生在对实体数据进行数据库更新操作之前。DQL UPDATE 语句不调用它。

另外,请注意这是针对 Doctrine 的,而不是专门针对 Symfony 的。

于 2013-01-15T19:53:22.260 回答