Подтвердить что ты не робот

Symfony preUpdate против prePersist

Я новичок в Symfony2, и я хотел бы знать, в чем разница в событиях prePersist и preUpdate. Похоже, что prePersist 'уволен', прежде чем я "сохраняю" запись, но когда происходит preUpdate fire?

4b9b3361

Ответ 1

Ни один из них не является частью Symfony. Они являются частью Doctrine2. prePersist срабатывает в том случае, когда объект сначала сохраняется. Сохранение объекта означает, что он управляется EntityManager Doctrine, даже если он фактически не вставлен в базу данных до флеша.

preUpdate - это соответствующее событие на существующем объекте, который должен быть обновлен. Поскольку существующий объект уже управляется entityManager в момент его запроса, нет эквивалентного события persist. Он в основном срабатывает, когда существующий объект был изменен, и вызывается флеш.

Другими словами, , если вы ничего не изменили в объекте, PreUpdate не будет запущен!

С учетом сказанного вы можете думать об этом как о происходящем "непосредственно перед вставкой" и "непосредственно перед обновлением".

Есть также две формы: обратные вызовы жизненного цикла, которые могут быть аннотированы непосредственно в сущности и добавлены как методы внутри нее, но имеют доступ только к атрибутам сущности. Это может быть полезно для простых манипуляций, таких как временная привязка, соответствие строк конкретному стандарту или генерация полученных атрибутов.

Существуют также истинные прослушиватели событий, которые должны быть зарегистрированы в entityManager и иметь доступ к данным о событиях, которые имеют тип до/после данных, которые вы ожидаете в триггере базы данных.

Обратите внимание, что в Doctrine version 2.4 они добавили данные о событиях даже для обратных вызовов Lifecycle, что теперь делает намного проще и проще сделать то же самое которые вам раньше нужно было использовать для прослушивания событий.

Ответ 2

Также стоит отметить:

- Если ваш объект не имеет никаких измененных значений, PreUpdate НЕ будет запускаться.

Таким образом, вы не можете полагаться на это, чтобы просто обновлять временную метку модификации всякий раз, когда сохраняется форма. Это особенно сложно, если у вас есть коллекция форм на одной странице, и пользователь может обновить некоторые поля включенных подформ. Объекты, которые были обновлены, вызовут PreUpdate, но объект первичной формы не будет запускать PreUpdate, если не будут обновлены OWN-поля.

- Вы можете установить несколько аннотаций обратного вызова жизненного цикла для PrePersist и PreUpdate

Так, например, если вы хотите установить временную метку модификации при создании записи И когда она будет обновлена, вы можете добавить обе аннотации к одной и той же функции в сущности, например.

/**
 * @ORM\PreUpdate
 * @ORM\PrePersist
 */
public function setTimeModValue() {
    $this->timeMod = time();
}

Ответ 3

Отсюда: http://docs.doctrine-project.org/en/2.0.x/reference/events.html#lifecycle-events

prePersist. Событие prePersist встречается для данного объекта до выполнения соответствующей операции EntityManager для этого объекта.

preUpdate. Событие preUpdate происходит перед операциями обновления базы данных с данными сущности. Он не вызывается для оператора DQL UPDATE.

Также обратите внимание, что это для Doctrine, а не только для Symfony.