Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Похоже, что описанный выше сценарий не относится к последней версии 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 для своих собственных событий.