Доктрина 2 PrePersist не срабатывает - PullRequest
20 голосов
/ 29 октября 2011

В одной и той же сущности у меня есть 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 на вершине сущности.

Ответы [ 5 ]

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

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

/**
 * Report\MainBundle\Entity\Serveur
 * @ORM\HasLifecycleCallbacks
 */
class Serveur {
36 голосов
/ 12 марта 2012

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

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

11 голосов
/ 15 марта 2013

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

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

5 голосов
/ 24 июня 2012

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

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

use Doctrine\ORM\Mapping as ORM;

// ...

/**
* @ORM\PreUpdate
*/
public function preUpdate()
{
}
3 голосов
/ 23 июня 2016

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

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

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

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

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

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

...