Доктрина 2. Нужно выполнять код до-персистировать / пост-персистировать - PullRequest
6 голосов
/ 12 октября 2011

Я использую Доктрину 2 сущности. У нас есть некоторые объекты, которые должны обновлять связанные элементы, когда они сохраняются в базе данных. Например, когда пользовательская запись изменена, мы сохраняем ее как новую запись с полем «неактивно», установленным на «ложь». Тем не менее, мы должны установить для поля «неактивное» для всех предыдущих записей этого пользователя значение «истина». Это сделано для ведения истории аудита. Это база данных Legacy, поэтому изменение структуры не вариант.

Поскольку Doctrine сохраняет объекты, передавая их персистирующему объекту (persist :: ($ thisObj)), а не объекту, имеющему метод save ($thisObj->save()), мы не можем просто расширить метод 'save' из родительский объект. Единственный вариант, который я вижу здесь, это попытаться расширить объект «persist», но это звучит как гусиная стайка, просто ожидающая, чтобы это произошло.

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

Как добавить функциональность до сохранения / после сохранения в некоторые из моих объектов?

Ответы [ 3 ]

12 голосов
/ 12 октября 2011

Итак, вы, вероятно, уже знаете http://www.doctrine -project.org / docs / orm / 2.1 / en / reference / events.html верно?

Вы добавляете аннотацию, чтоСущность содержит обратные вызовы, а затем создает определенные функции (которые должны быть общедоступными) для этой сущности, а также комментирует их с помощью @PrePersist или @PostPersist или чего-либо еще.

Другой способ - создать подписчика на событие, зарегистрировать его с помощью менеджера событий doctrine и реализовать методы, называемые prePersist, postPersist и т. Д. Им передается объект EventArguments, который содержит сущность, относящуюся к произошедшему событию.*

Я знаю, что это очень общий ответ на ваш вопрос, но вам нужно быть более конкретным, в чем заключается ваша проблема.

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

7 голосов
/ 13 октября 2011

На самом деле довольно просто делать то, что ты хочешь делать.Это не требует работы с менеджером событий или чего-то такого сложного.Вы используете что-то под названием «Обратные вызовы жизненного цикла».Это функции, которые Doctrine автоматически запускает в течение «жизненного цикла» сущности, а именно: prePersist, postPersist, preUpdate, postUpdate и т. Д. Полный список можно найти здесь: http://www.doctrine -project.org / docs / orm/2.0/en/reference/events.html

Процесс добавления этой функции в ваши сущности очень прост.

  1. В разделе Аннотации вашей сущности добавьте следующий тег: «@HasLifecycleCallbacks».Это говорит доктрине, что она должна искать в сущности функции, выполняемые при различных событиях
  2. Напишите в вашей сущности публичную функцию, которую вы хотели бы запустить при конкретном событии.
  3. Поместите аннотацию вышефункция, указывающая, какое событие следует использовать для обработки.

Например, посмотрите на следующий код:

/** @PostPersist  */
public function doSPostPersist() {
    $this->tester = 'Value changed by post-persist';
}

Я обнаружил, что иногда события просто отказываются срабатыватьи я пока не знаю почему.Но когда они стреляют, они будут стрелять надежно.

2 голосов
/ 16 ноября 2012

Не забудьте включить обратные вызовы жизненного цикла в аннотации вашего класса:

/**
 * Report\MainBundle\Entity\Serveur
 * @ORM\HasLifecycleCallbacks
 */
class Serveur {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...