Доктрина слушатель против абонента


Я работаю в рамках Symfony2 и задаюсь вопросом, когда можно использовать подписчика доктрины против слушателя. Учение-это документация для слушателей очень ясно, однако подписчики скорее умалчивается. В Symfony это запись в поваренной книге аналогично.

7 65

7 ответов:

С моей точки зрения, есть только одно существенное различие:

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

Это может показаться не большая разница, но если вы думаете об этом, есть некоторые случаи, когда вы хотите использовать один над другим:

  • вы можете назначить одного слушателя для многих диспетчеров с помощью различные события, как они установлены во время регистрации. Вам нужно только убедиться, что каждый метод в слушателя
  • вы можете изменить события, для которых зарегистрирован подписчик во время выполнения и даже после регистрации подписчика, изменив возвращаемое значение getSubscribedEvents (подумайте о времени, когда вы слушаете очень шумное событие, и вы хотите выполнить что-то только один раз)

могут быть и другие различия, о которых я не знаю!

Не знаю, сделано ли это случайно или намеренно.. Но подписчики имеют более высокий приоритет, чем слушатели - https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php#L73-L98

со стороны доктрины ему все равно, что это (слушатель или подписчик), в конечном итоге оба зарегистрированы как слушатели - https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/EventManager.php#L137-L140

Это то, что я заметил.

вы должны использовать подписчик событий, когда вы хотите иметь дело с несколькими событиями в одном классе, например в этом symfony2 doc страница статья, можно заметить, что прослушиватель событий может управлять только одним событием, но допустим, вы хотите иметь дело с несколькими событиями для одного объекта, prePersist, preUpdate, postPersist и т. д... если вы используете прослушиватель событий, вам нужно будет закодировать несколько прослушивателей событий, по одному для каждого события, но если вы идете с подписчиком событий, вам просто нужно закодировать один класс событие абонента, посмотрите, что с событием абонента вы можете управлять более чем одного события в один класс, ну вот так я использую это, я предпочитаю код сосредоточен в том, что модель бизнес-параметрам, одним из примеров этого может быть пошел вы хотите обрабатывать несколько событий жизненного цикла мировыми только для группы лиц, для этого можно код родительского класса и определенными эти глобальные методы в нем, а затем сделать ваши объекты наследуют этот класс и в дальнейшем в вашем случае абонента вы подписаться каждый случай вы want, prePersist, preUpdate, postPersist и т. д... а затем попросите родительский класс и выполните эти глобальные методы.

оба позволяют выполнить что-то на конкретном событии pre / post persist и т. д.

однако прослушиватели позволяют только выполнять поведение, инкапсулированное в вашей сущности. Таким образом, примером может быть обновление метки времени "date_edited".

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

еще одна важная вещь: доктрина EventSubscribers не позволяет установить приоритет.

подробнее по этому вопросу здесь

вот что говорит об этом док в 4.1. Как это применяется к событиям, я полагаю, что это также распространяется на учения (не на 100% уверен).

слушатели и подписчики

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

  • подписчики легче повторное использование, поскольку сведения о событиях хранятся в классе, а не в определении службы. Это причина, по которой Symfony использует подписчиков внутри;
  • слушатели являются более гибкими, потому что пакеты могут включить или отключить каждый из них условно в зависимости от стоимости конфигурации.

http://symfony.com/doc/master/event_dispatcher.html#listeners-or-subscribers

из документации :

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

другой способ прослушивания событий - через подписчика событий. Событие подписчик-это класс PHP, который может точно сказать диспетчеру какие события он должен подписаться. Он реализует EventSubscriberInterface интерфейс, который требует одного статического метод называется getSubscribedEvents ().

Смотрите пример здесь:

https://symfony.com/doc/3.3/components/event_dispatcher.html