Doctrine 2 prePersist не срабатывает

#php #doctrine #doctrine-orm

#php #доктрина #doctrine-orm

Вопрос:

Внутри одной и той же сущности у меня есть preUpdate и prePersist. Срабатывает предварительное обновление, но prePersist никогда не срабатывает. Я ставлю a die() после сброса и комментариев в обратных вызовах жизненного цикла. Полную сущность можно увидеть на http://pastebin.com/yUk1u4GQ

Обратные вызовы сущностей

 /**
* @PreUpdate
*/
public function fixDates(){
    $this->updatedOn = $this->getNow();
    $this->closedDate = null;
    $this->openDate = null;
    print "dates fixed";
}

/**
* @PrePersist
*/
public function prePersist() {
    print 'in prePersist';
    die();
}
  

Диспетчер сущностей вызывает

 $em->persist($school);

$em->flush();
die();
  

На моем экране отображается «фиксированные даты», но не сообщение prePersist. У меня есть @HasLifecycleCallbacks в верхней части объекта.

Ответ №1:

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

 /**
 * ReportMainBundleEntityServeur
 * @ORMHasLifecycleCallbacks
 */
class Serveur {
  

Комментарии:

1. Это была моя проблема. Спасибо!

2. Я отсутствовал @HasLifecycleCallbacks . Спасибо!

Ответ №2:

prePersist запускается только тогда, когда вы выполняете INSERT оператор, а не UPDATE оператор.

При тестировании не забывайте, что UPDATE оператор запускается только тогда, когда атрибуты сущности действительно меняются. Если диспетчер сущностей вызывается для сохранения этой сущности, он сначала проверяет, есть ли какие-либо изменения. В противном случае sql-запрос не выполняется и @PreUpdate метод не вызывается.

Комментарии:

1. Поддержано. Я тоже обнаружил это на собственном опыте (с помощью пошаговой отладки), когда мой код работал не так, как я ожидал. ИМО, текущая документация не делает это достаточно ясным, из-за чего легко допустить ошибку.

Ответ №3:

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

Хотя кажется, что запущенный метод будет использоваться только самим классом сущности, его область действия должна быть общедоступной. Мой метод не запускался только потому, что я пометил его как защищенный. Я надеюсь, что это кому-то поможет.

Комментарии:

1. Это тоже была моя проблема! Наряду с @ORMHasLifecycleCallbacks

Ответ №4:

У меня только что была такая же проблема. Надеюсь, это поможет вам:

Я забыл импортировать аннотации с помощью инструкции use. Если вы попробуете это, не забудьте добавить префикс «ORM»:

 use DoctrineORMMapping as ORM;

// ...

/**
* @ORMPreUpdate
*/
public function preUpdate()
{
}
  

Ответ №5:

Возможно, это зависит от версии, но мои рабочие аннотации имеют следующий вид:

Аннотация класса жизненного цикла:

 /**
 * @Entity @Table(name="table_name")
 * @HasLifecycleCallbacks
 **/
  

Аннотации событий:

 /** @PrePersist **/
/** @PreUpdate **/
  

Это все, что у меня есть в модели.

Комментарии:

1. Да!! Согласно документам в doctrine 2 Помечает метод для объекта, который будет вызываться как событие @ prePersist. Работает только с @ HasLifecycleCallbacks в классе сущностей PHP DocBlock.