Где разместить EventDispatcher в Symfony2 и как использовать его с аннотациями? - PullRequest
1 голос
/ 23 февраля 2012

Я начинаю разработку с Symfony2 framework , и мне нравится использовать Eventdispatcher.Теперь у меня есть три вопроса, которые я мог бы найти ответ в Google еще.

  1. Где я размещаю диспетчер, чтобы он был доступен из любого места в приложении?

  2. Как я могу настроить клиенты?Должен ли я поместить все в один файл или по одному для каждого сгустка?

  3. Сколько нужно усилий, чтобы настроить его с аннотациями, например @Event("some.event")?Это возможно?

Ответы [ 2 ]

3 голосов
/ 23 февраля 2012

Общее

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

Внутренние компоненты Symfony2 - Диспетчер событий

Местоположение событий

С точки зрения местоположения, папка «Событие» внутриподходящий комплект - хороший выбор.Вполне вероятно, что фактическая отправка события будет происходить только в контексте пакета, тогда как слушатели могут находиться в другом месте.Однако это отдельная тема, которая имеет минимальное значение, поскольку они просто подписываются на строковое имя события (например, «store.order», чтобы позаимствовать пример документации) и требуют только знания интерфейса / типа события.

Таким образом, у вас может быть событие под названием «Foo» в пакете «Bar» в пространстве имен «Zap»:

namespace Zap\Bar\Event;

use Symfony\Component\EventDispatcher\Event;

class FooEvent extends Event
{
    // ...
}

Когда вы приедете, чтобы отправить событие из вашего пакета, вы можете использоватьидентификатор события 'zap.bar.foo', и, конечно, вы можете затем зарегистрировать слушателей из других мест, чтобы получать уведомления об этом идентификаторе, как считаете нужным.

Доступ к диспетчеру событий

Если вы хотите получить доступ к первичному экземпляру EventDispatcher, получите доступ к контейнеру внедрения зависимостей и получите службу event_dispatcher.Простой подход заключается в том, чтобы ваш класс расширил «ContainerAware», а затем получил диспетчер с помощью

$dispatcher = $this->container->get('event_dispatcher');
2 голосов
/ 24 августа 2012

Чтобы ответить на ваш первый вопрос:

Где я размещаю диспетчер, чтобы он был доступен из любого места в приложении?

На самом деле, уже есть предварительно настроенный диспетчер событийуслуга доступна, как указал @ jstephenson , позвонив по номеру $dispatcher = $this->container->get('event_dispatcher');, чтобы вам не пришлось нигде создавать свой собственный экземпляр.

Однако, если вам нужен собственный диспетчер событий, выВы можете просто настроить его в своем файле конфигурации служб (т.е. services.xml) вашего пакета следующим образом:

<service id="my_dispatcher" class="Symfony\Component\EventDispatcher\EventDispatcher" />

Конечно, вы можете использовать свой собственный класс диспетчера, если он реализует EventDispatcherInterface.

...