Symfony, кажется, регистрируется, но не вызывает событие моей доктрины - PullRequest
0 голосов
/ 21 ноября 2018

sry, если что-то не так точно, но я менее опытен с Symfony

У меня есть следующее отображение orm:

src/app/ExampleBundle/Resources/config/doctrine/Base.orm.yml

app\ExampleBundle\Entity\Base:
type: mappedSuperclass
fields:
    createdAt:
        type: datetime
        nullable: true
        options:
            default: null
    updatedAt:
        type: datetime
        nullable: true
        options:
            default: null

Это создает базу сущностей, которую я изменил, чтобы быть абстрактной

src/app/ExampleBundle/Entity/Base.php

abstract class Base {
    ...
}

У меня есть некоторые другие сущности, которые расширяют этот абстрактный класс, например,

src/app/ExampleBundle/Entity/Category.php

class Category extends Base
{
    ...
}

Теперь я попытался добавить прослушиватель, который устанавливает dateAt / updatedAt datetime при каждом сохранении для каждой сущности, котораярасширяет базовый объект

src/app/ExampleBundle/EventListener/BaseListener.php

namespace app\ExampleBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use Symfony\Component\Security\Core\User\UserInterface;
use app\ExampleBundle\Entity\Base;

class BaseListener
{
    protected $tokenStorage;

    public function __construct(TokenStorage $tokenStorage)
    {
        $this->tokenStorage = $tokenStorage;
    }

    public function prePersist(Base $base, LifecycleEventArgs $event)
    {
        $user = $this->tokenStorage->getToken()->getUser();
        if (!$user instanceof UserInterface) {
            $user = null;
        }

        if ($base->getCreatedAt() === null) {
            $base->setCreated($user, new \DateTime());
        } else {
            $base->setUpdated($user, new \DateTime());
        }
    }
}

и добавляет его в комплекты services.yml

src/app/ExampleBundle/Resources/config

services:
    app\ExampleBundle\EventListener\BaseListener:
        arguments: ['@security.token_storage']
        tags:
            - { name: doctrine.orm.entity_listener, entity: app\ExampleBundle\Entity\Base, event: prePersist }

Symfony не выдает никаких исключений, но определенное событие, похоже, также не инициируется.

Я пытался изменить параметр сущности в службах на «реальную» категорию сущности, но все равно не было ошибки, ни событие не сработало.

Думаю, я сделал все так, как описано в документации.Но это все еще не работает.

Команда

debug:event-dispatcher

также не показывает событие

Итак, вопрос: что я сделал не так?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

После некоторых исследований, еще много тестов, погружаясь в EntityManager и UnitOfWork.Кажется, ничего не работает нормально.Я до сих пор понимаю, что он работает на doctrine:fixtures:load, но по любой причине они все еще не работают, если я использую диспетчер сущностей в контроллерах.Итак, я решил попробовать другой способ с подписчиком.

tags:
    - { name: doctrine.event_subscriber }

class ... implements EventSubscriber

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

Спасибо всем вам за поддержку:)

0 голосов
/ 22 ноября 2018

Вот документация, за которой я следую https://symfony.com/doc/3.4/doctrine/event_listeners_subscribers.html

Метод prePersist вызывается для всех сущностей, поэтому вы должны исключить не экземпляр app \ ExampleBundle \ Entity \ Base.Первый аргумент - LifecycleEventArgs.

public function prePersist(LifecycleEventArgs $event)
{
    $base = $event->getObject();
    if (!$base instanceof Base) {
        return;
    }
    $user = $this->tokenStorage->getToken()->getUser();
    if (!$user instanceof UserInterface) {
        $user = null;
    }

    if ($base->getCreatedAt() === null) {
        $base->setCreated($user, new \DateTime());
    } else {
        $base->setUpdated($user, new \DateTime());
    }
}

Я могу порекомендовать вам StofDoctrineExtensionsBundle (Timestampable), который делает именно то, что вы хотите.Он основан на DoctrineExtensions .

Существует даже черта , которая работает как шарм.

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