Doctrine 2 LifecycleCallbacks с абстрактным базовым классом не называются

У меня такая ситуация:

Аннотация Класс:

abstract class AbstractBase { /** * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") * @var integer */ protected $id; /** * @ORM\Column(type="datetime", name="updated_at") * @var \DateTime $updatedAt */ protected $updatedAt; /** * @ORM\PreUpdate */ public function setUpdatedAt() { die('THIS POINT IS NEVER REACHED'); $this->updatedAt = new \DateTime(); } } 

Класс бетона:

 /** * @ORM\Entity(repositoryClass="Entity\Repository\UserRepository") * @ORM\Table(name="users") * @ORM\HasLifecycleCallbacks */ class User extends AbstractBase { // some fields, relations and setters/getters defined here, these all work as expected. } 

Затем я вызываю его в своем контроллере следующим образом:

 $user = $this->em->find('Entity\User', 1); // i call some setters here like $user->setName('asd'); $this->em->flush(); die('end'); 

Все работает так, как ожидалось, поэтому поле id из абстрактного класса создается для объекта User, я могу получить к нему доступ и т. Д. Проблема заключается в том, что строка «die (« ЭТОТ ТОЧКА НИКОГДА НЕ ДОСТИГАЕТСЯ ») никогда не достигается. (Обратите внимание на @ORM \ PreUpdate) Это означает, что lifecycleCallbacks не вызываются унаследованными объектами. Это ошибка, или есть причина для этого?

Solutions Collecting From Web of "Doctrine 2 LifecycleCallbacks с абстрактным базовым классом не называются"

Ваш абстрактный базовый класс должен быть анотирован как сопоставленные суперклассы и включать HasLifecycleCallbacks -Annotation.

Дополнительная информация: Картирование наследования в документации доктрины .

 /** * @ORM\MappedSuperclass * @ORM\HasLifecycleCallbacks */ abstract class AbstractBase { [...] /** * @ORM\PreUpdate */ public function setUpdatedAt() { $this->updatedAt = new \DateTime(); } } /** * @ORM\Entity(repositoryClass="Entity\Repository\UserRepository") * @ORM\Table(name="users") */ class User extends AbstractBase { // some fields, relations and setters/getters defined here, these all work as expected. } 

Вы должны аннотировать базовый класс с @ORM\HasLifecycleCallbacks , а функция с @ORM\preUpdate

У вас есть опечатка (PreUpdate должен быть preUpdate), также preUpdate не вызывается при создании (только при обновлении). Поэтому, если вы хотите, чтобы это также срабатывало при создании, вы должны добавить @ORM\prePersist .

Хотя принятый ответ правильный для общего случая, в данном конкретном случае (временная метка) вы действительно хотите использовать расширение доктрины Timestampable, как описано, например, здесь Проблема обратного вызова Lifecycle при расширении пользовательского объекта FOSUserBundle

Может быть, я ошибаюсь, но я не думаю, что preUpdate не срабатывает, когда вы сохраняете сущность. У вас должен быть @prePersist.

http://www.doctrine-project.org/docs/orm/2.0/en/reference/events.html

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

Надеюсь, @prePersist поможет вам.

Возможно, вы могли бы сообщить эту проблему как ссылку, как настроить свои аннотации? Кажется, что тестовый файл действителен и соответствует вашему варианту использования.

Важно, чтобы MappedSuperclass с HasLifecycleCallbacks находился в том же пространстве имен или в каталоге, что и их дочерние сущности.

У меня были проблемы с обратными вызовами жизненного цикла, когда MappedSuperclass находился в одном каталоге (Модель), а Сущности были в другом (Entity). Помещение MappedSuperclass в тот же каталог, что и Entities (Entity), решило проблему.

Я думаю, что вы должны аннотировать базовый класс с помощью @ORM \ HasLifecycleCallbacks

документы