Symfony 2 - обработка нескольких прослушивателей сущностей на одном сущности - PullRequest
0 голосов
/ 10 октября 2018

Допустим, у меня есть сущность Product, и у меня есть сущность ListenerA (preUpdate, prePersist) для нее внутри моего приложения.

class ListenerA {
public function prePersist(LifecycleEventArgs $args)
{
    ...
}
public function prePersist(LifecycleEventArgs $args)
{
    ...
}

Допустим, что сущность Productимеет свойство visible (bool), и для каждого обновления этой сущности visible может изменить либо 1, либо 0 в зависимости от некоторой логики.

Также в этом приложении Symfony есть пакет PHP, полученный изчастный репозиторий.Этот пакет обеспечивает отслеживание изменений сущностей на всех сущностях.Он имеет ListenerB, который отслеживает все объекты.Он также использует ту же доктрину, что и приложение.На onFlush этот слушатель отправит изменения в потоковую службу AWS.

Моя проблема, например, в том, что существует запись, которая будет обновлена.Конечно, сработает two listeners (ListenerA и ListenerB).

Идентификатор продукта: 1 title: 'some title' property1: 1 property2: 1 property3: 1 visible: 1

Например, бизнес-правило заключается в том, что сущность была изменена или обновлена, и если property1, property2 и property3 имеют значение true, видимость Продукта должна быть установлена ​​в значение true, в противном случае это будет значение false. .Это правило было установлено для прослушивателя сущностей.

Так что, если я, например, изменю property3 = 0, тогда visible должно теперь быть false.

Но, как я уже упоминал, тамтакже является другим слушателем ListenerB в пакете PHP, который отслеживает также изменения в этом объекте.

Проблема в том, что когда ListenerB в этом пакете PHP был запущен, он не получает обновлены изменения свойства Product visible, которое было вызвано ListenerA (реализует бизнес-логику).

Например, visibility Product равно 1 и ListenerB было выдвинуто в поток, но затем ListenerA изменило его на 0 для некоторой логики.

Данные, переданные в поток, не были обновленным значением.

Мне нужно отследить последние изменения, сделанные на ListenerA, прежде чем нажимать изменения на ListenerB.

Скорее всего, у меня ограничен доступ к ListenerB.У меня есть полный доступ для редактирования кода на ListenerA.

Есть ли у вас какие-либо предложения или обходные пути для этого?

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 11 октября 2018

При общем определении слушателя вы можете указать priority.

Слушатель с приоритетом наивысший выполняется первый

services:
    app.listener.a:
        class: Acme\Listener\AListener
        tags:
            - { name: doctrine.event_listener, event: postPersist, priority: 100 }

services:
    app.listener.b:
        class: Acme\Listener\BListener
        tags:
            - { name: doctrine.event_listener, event: postPersist, priority: 50 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...