PreUpdate в Doctrine2 отсутствует аргумент PreUpdateEventArgs в Symfony2 - PullRequest
3 голосов
/ 04 февраля 2012

Документация Doctrine2 по preUpdate событию говорит

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

Звучит полезно!Итак, что я делаю:

/**
 * Acme\TestBundle\Entity\Article
 *
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class Article
{
    // ...

    /**
     * @ORM\PreUpdate
     */
    public function preUpdate(\Doctrine\ORM\Event\PreUpdateEventArgs $eventArgs)
    {
        if ( /* use $eventArgs here */ )

            $this->updatedAt = new \DateTime();
    }

    // ...
}

Но не повезло - аргументы не передаются:

Catchable Fatal Error: Аргумент 1, переданный
Acme\TestBundle\Entity\Article::preUpdate(), должен быть экземпляром
Doctrine\ORM\Event\PreUpdateEventArgs, нет данных , вызывается в
...\vendor\doctrine\lib\Doctrine\ORM\Mapping\ClassMetadataInfo.php в строке 1540 и определяется в ...\src\Acme\TestBundle\Entity\Article.php строке 163

Я думаю, это должно работатькаким-то другим способом в Symfony2.Как мне это сделать?

Ответы [ 2 ]

16 голосов
/ 07 июня 2012

Вы должны помнить, что с экземпляром PreUpdateEventArgs у вас есть доступ ко всем полям, которые ИЗМЕНЕНЫ для этого объекта с их старым и новым значением.Но у вас пример обновлен, не будет при той ревизии.Если вы попытаетесь установить значение updatedAt, вы должны получить ошибку: «Поле« updatedAt »не является допустимым полем сущности».Таким образом, вы можете изменить поле updateAt, а затем использовать UnitOfWork: RecomputeSingleEntityChangeSet.Пример:

public function preUpdate(PreUpdateEventArgs $args)
{
    $entity = $args->getEntity();
    $em = $args->getEntityManager();
    $uow = $em->getUnitOfWork();

    if ($entity instanceof Product)
    {
        $entity->setDiscount(123);

        $uow->recomputeSingleEntityChangeSet(
            $em->getClassMetadata("XXXBundle:Product"),
            $entity
         );
    }
}

Дополнительные примеры кода в моем блоге (на russain :)): Обновление сущности доктрины в событии preUpdate

4 голосов
/ 04 февраля 2012

Существует два способа обработки событий жизненного цикла.

Первый - просто аннотировать метод вашей сущности доктрины как @ORM \ PreUpdate.Этот метод будет вызван перед обновлением.Второй сложнее.В нем участвует слушатель preUpdate.Это отдельный класс, на который вы подписываетесь для прослушивания определенных событий.

Читайте внимательно с здесь снова и symfony поваренная книга .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...