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