Вопрос по symfony, events – События preUpdate и postUpdate, не запускаемые в Doctrine 2

9

Я следовал инструкциям из этого урока:http: //symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.htm и создали простой прослушиватель, который прослушивает события, отправляемые Doctrine при вставке или обновлении объекта. События preInsert и postInsert работают нормально и отправляются при создании нового объекта. Однако preUpdate и postUpdate никогда не вызываются при обновлении объекта, несмотря ни на что. То же самое относится и к Flush. Как примечание, у меня есть сгенерированный консоль контроллер, который поддерживает основные операции CRUD, и я оставил его без изменений.

Ниже приведены некоторые фрагменты кода, демонстрирующие, как я это делаю.

Config.yml

<code>annotation.listener:
    class: City\AnnotatorBundle\Listener\AnnotationListener
    tags:
        -  { name: doctrine.event_listener, event: postUpdate}
</code>

еализация @Listener (я упустил другие функции и оставил только postUpdate для простоты)

<code>class AnnotationListener
{

    public function postUpdate(LifecycleEventArgs $args)
    {
        $entity=$args->getEntity();

        echo $entity->getId();
        die;
    }
}
</code>

Идентификатор объекта никогда не отображается, и сценарий продолжает выполняться, пока не завершится, несмотря наумерет в конце функции.

Ваш Ответ

1   ответ
13

Ты забыл добавить@HasLifecycleCallbacks аннотации? Вы могли бы использовать@PreUpdate Аннотация и пропустить определение сервиса в целом.

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class YouEntity
{

    /**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function preUpdate(){
        // .... your pre-update logic here
    }
    ....
}

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

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

Подробнее о обратных вызовах жизненного цикла можно прочитать здесь:http: //symfony.com/doc/master/cookbook/doctrine/file_uploads.html#using-lifecycle-callback

true ... Однако я должен использовать другие сущности и самого менеджера сущностей и, возможно, другие службы, так что это не будет хорошей идеей. Во всяком случае, похоже, что проблема решена сейчас. Я обновил до последней версии Symfony, очистил кеш, и все работает. tomor
А, да, если вы используете другие сервисы / организации, имеет смысл не идти по этому пути:) Jovan Perovic

Похожие вопросы