Symfony, Doctrine: как отключить Entity Listeners? - PullRequest
0 голосов
/ 27 ноября 2018

Мне нужно сохранить некоторые приборы с помощью Alice Fixtures Bundle, не вызывая конкретного прослушивателя сущностей.
Прослушиватель связан с моей сущностью посредством аннотации EntityListeners.
Я бы не хотел менять самого слушателя.

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

Я уже пытался этот ответ уже, но $em->getEventManager()->getListeners() не возвращает прослушиватели сущностей.

ClassMetadata дает мне список подписанных прослушивателей сущностей для этой сущности, но это просто массив только для чтения.

Есть лиспособ отключения этих Entity Listeners?

Ответы [ 2 ]

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

Вы можете использовать EntityListenerResolver API

$em->getConfiguration()->getEntityListenerResolver()->clear();

или если вы хотите очистить прослушиватель определенного класса

$em->getConfiguration()->getEntityListenerResolver()->clear(YourEntityListener::class);

Подробнее см. В интерфейсе EntityListenerResolver Информация.

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

Я нашел способ, но он противный.
Вот что я делаю в своем загрузчике:

$em = $this->container->get('doctrine.orm.default_entity_manager');

$entitiesWithListeners = [
    Post::class,
    Comment::class
];

$listenersToDisable = [
    MyListener::class
];

foreach ($entitiesWithListeners as $entity) {
    $metadata = $em->getMetadataFactory()->getMetadataFor($entity);

    foreach ($metadata->entityListeners as $event => $listeners) {

        foreach ($listeners as $key => $listener) {
            if (in_array($listener['class'], $listenersToDisable)) {
                unset($listeners[$key]);
            }
        }
        $metadata->entityListeners[$event] = $listeners;
    }
    $em->getMetadataFactory()->setMetadataFor($entity, $metadata);
}

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

Это уродливо, но эй, это работает.Поскольку на данный момент я застрял с AliceBundle v1.4, и мне придется все изменить, когда мы обновим проект, это подойдет.

...