2014-01-16 3 views
13

Как, если вообще, разработчик пакета Symfony 2 должен использовать диспетчер событий, который поставляется с системой Symfony 2 для акций?Использование диспетчера событий Symfony 2

Я искал источник для диспетчера событий Symfony, и некоторые из того, что я видел, немного озадачили меня, как я, сторонний разработчик пакетов, должен использовать диспетчер событий, который поставляется с Symfony.

В частности, я заметил, что система Symfony имеет два услуги диспетчера событий. event_dispatcher и debug.event_dispatcher. Какая служба Использование HttpKernel зависит от среды и управляется сгенерированным файлом-контейнером dev или prod.

//dev kernel instantiation uses `debug.event_dispatcher` service 
new \Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel(
      $this->get('debug.event_dispatcher'), 
      $this, 
      $this->get('debug.controller_resolver') 
     ); 

//prod kernel instantiation uses `event_dispatcher` service   
new \Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel(
      $this->get('event_dispatcher'), 
      $this, 
      new \Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver($this, $this->get('controller_name_converter'), $this->get('monolog.logger.request', ContainerInterface::NULL_ON_INVALID_REFERENCE))); 

До сих пор все это имеет смысл, - как это debug.event_dispatcher, который реализует функциональные возможности на вкладке мероприятия веб-профиля, в том числе возможность увидеть, какие слушатели называли, и какие слушатели не были названы.

Однако, я заметил, что большинство (если не все) сторонних пакетов используют жестко закодированный служебный вызов event_dispatcher. Например, JMS/JobQueueBundle использует следующие

$this->dispatcher = $this->getContainer()->get('event_dispatcher'); 

События послано как этот огнь правильно, но debug.event_dispatcher не знает о них, что означает, что веб-профайлер Symfony будет неправильно перечисляет под названием слушатель, как невостребованный. Кроме того, неясно, как автор пучка мог избежать этого, поскольку у них нет преимущества в создании файла контейнера и, объект HTTP Kernel не предоставляет аксессуар для защищенного объекта диспетчера.

Итак, это ошибка в Symfony?

Или услуга event_dispatcher предназначена только для событий Kernel, что означает, что все эти разработчики пучков злоупотребляют им?

Или (наиболее вероятный кандидат), это что-то еще, что я пропустил или не рассмотрел?

+0

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

ответ

7

Похоже, что описанный выше сценарий не относится к последней версии Symfony (2.4.1). В частности, в 2.4.1, сгенерированный приложением контейнера файл

app/cache/dev/appDevDebugProjectContainer.php 

содержит следующие

$this->aliases = array(
    //... 
    'event_dispatcher' => 'debug.event_dispatcher', 
    //... 
); 

То есть, в отличие от проекта Symfony 2.3.6 я работал, то event_dispatcher услуга псевдонимами в debug.event_dispatcher службы (когда Symfony работает в режиме разработки). Это означает, что когда другие пакеты запрашивают услугу event_dispatcher в режиме dev, они действительно получают услугу debug.event_dispatcher. Это позволяет debug.event_dispatcher знать обо всех событиях и может правильно сообщать о том, какие из них были отправлены.

Хотя это не конкретный ответ, это указывает на то, что команда Symfony была/знает о проблеме, что заставляет меня поверить, что их намерение разработчиков Bundle использовать сервис event_dispatch для своих собственных событий.

Смежные вопросы