Symfony слушатель - postUpdate duplon - PullRequest
0 голосов
/ 18 апреля 2020

Я бегу Symfony 3 LTS. У меня есть подписчик, прослушивающий событие postUpdate для того, чтобы войти в БД для всех действий с продуктами в моей базе данных. Ниже мой код:

use AppBundle\Entity\History;

public function getSubscribedEvents()
{
    return [
        Events::postUpdate,
    ];
}

public function postUpdate(LifecycleEventArgs $args)
{
    if(!is_null($this->tokenStorage->getToken())) {
        $user = $this->tokenStorage->getToken()->getUser();
        $entity = $args->getObject();
        $em = $args->getEntityManager();
        if ($entity instanceof Product) {
            $history = new History($user, "Product #5 has been updated");
            $em->persist($history);
        }
        $em->flush();
    }
}

Проблема: History дважды вставляется в базу данных. Я не могу понять, почему. Я пытался удалить методы persist() и / или flush(), но ничего не было создано.

PS: между моими сущностями Product и History нет никакой связи. И это не должно быть. Моя проблема - только повторяющееся поведение.

enter image description here

1 Ответ

1 голос
/ 20 апреля 2020

У меня нет правильного ответа, но есть обходной путь:

use AppBundle\Entity\History;

    // Will contains the User ID to avoid duplicate log
    private $flushed = [];

    public function getSubscribedEvents()
    {
        return [
            Events::postUpdate,
        ];
    }

    public function postUpdate(LifecycleEventArgs $args)
    {
        if(!is_null($this->tokenStorage->getToken())) {
            $user = $this->tokenStorage->getToken()->getUser();
            $entity = $args->getObject();
            $em = $args->getEntityManager();
                                            // Check that the User.id is not already created in History during the update PHP Process
            if ($entity instanceof Product && !in_array($user->getId(), $this->flushed)) {
                $history = new History($user, "Product #5 has been updated");
                $em->persist($history);
                // Add the user ID in our array to avoid duplicate
                $this->flushed[] = $user->getId();
            }
            $em->flush();
        }
    }
...