Как, если вообще, разработчик пакета 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, что означает, что все эти разработчики пучков злоупотребляют им?
Или (наиболее вероятный кандидат), это что-то еще, что я пропустил или не рассмотрел?
Если вы создаете свой собственный пакет, вы можете использовать свой собственный диспетчер. Единственная причина использовать встроенную службу event_dispatcher - использовать события ядра, которые вам не всегда нужны. Но все же ваш вопрос верен. –