Doctrine 2 PrePersist не срабатывает
Внутри того же объекта у меня есть PreUpdate и PrePersist. PreUpdate срабатывает, но PrePersist никогда этого не делает. Я положил 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();
}
Entity Manager вызывает
$em->persist($school);
$em->flush();
die();
На моем экране отображаются "фиксированные даты", но не сообщение prePersist. У меня есть @HasLifecycleCallbacks
в верхней части объекта.
Ответы
Ответ 1
PrePersist запускается только тогда, когда вы выполняете инструкцию INSERT
, а не UPDATE
.
При тестировании не забывайте, что оператор UPDATE
запускается только тогда, когда атрибуты сущности действительно изменяются. Если Entity Manager вызывается для сохранения этого объекта, он сначала смотрит, есть ли какие-либо изменения. Если нет, запрос sql не выполняется и не вызывается метод @PreUpdate
.
Ответ 2
Не забудьте включить обратные вызовы жизненного цикла в аннотации класса:
/**
* Report\MainBundle\Entity\Serveur
* @ORM\HasLifecycleCallbacks
*/
class Serveur {
Ответ 3
Я знаю, что этот вопрос составляет почти 2 года, но у меня была точно такая же проблема, и поскольку у этого нет принятого ответа, я хочу поделиться тем, что все остальные забыли упомянуть.
Хотя кажется, что инициированный метод будет использоваться только самим классом сущности, его область должна быть общедоступной. Мой метод не запускался только потому, что я обозначил его как защищенный. Надеюсь, это поможет кому-то.
Ответ 4
У меня была такая же проблема. Надеюсь, это поможет вам:
Я забыл импортировать аннотации с помощью оператора use. Если вы попробуете это, не забудьте добавить префикс ORM:
use Doctrine\ORM\Mapping as ORM;
// ...
/**
* @ORM\PreUpdate
*/
public function preUpdate()
{
}
Ответ 5
Возможно, это зависит от версии, но мои рабочие аннотации имеют следующий вид:
Аннотации классов жизненного цикла:
/**
* @Entity @Table(name="table_name")
* @HasLifecycleCallbacks
**/
Аннотации событий:
/** @PrePersist **/
/** @PreUpdate **/
Это все, что у меня есть в Model.