如果有的话,Symfony 2 捆绑开发人员应该如何使用随 Symfony 2 系统一起提供的事件调度程序?

我一直在挖掘 Symfony 事件调度程序的源代码,我所看到的一些内容让我有点困惑,作为第三方包创建者,我应该如何使用 Symfony 附带的事件调度程序。

具体来说,我注意到一个股票 Symfony 系统有 两个 事件调度程序服务。 event_dispatcherdebug.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 实现了 web 配置文件的事件选项卡中的功能,包括查看哪些监听器被调用以及哪些监听器未被调用的能力。

但是,我注意到大多数(如果不是全部)第三方包使用硬编码的 event_dispatcher 服务调用。例如JMS/JobQueueBundle使用如下
$this->dispatcher = $this->getContainer()->get('event_dispatcher');

像这样触发的事件正确触发, debug.event_dispatcher 不知道它们,这意味着 Symfony Web 分析器会错误地将调用的监听器列为未调用的。此外,尚不清楚包作者如何避免这种情况,因为他们没有生成容器文件 的优势,HTTP 内核对象不会公开 protected 调度程序对象的访问器。

那么,这是 Symfony 中的错误吗?

还是 event_dispatcher 服务仅用于内核事件,这意味着所有这些包作者都在滥用它?

或者(最有可能的候选人)是我遗漏或没有考虑过的其他事情吗?

最佳答案

看起来我上面描述的场景不适用于最新版本的 Symfony ( 2.4.1 )。具体来说,在 2.4.1 中,生成的app容器文件

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 服务时,他们实际上得到的是 debug.event_dispatcher 服务。这让 debug.event_dispatcher 知道所有事件,并且它可以正确报告哪些事件被调度。

虽然这不是一个具体的答案,但它确实表明 Symfony 团队已经/已经意识到这个问题,这让我相信 Bundle 开发人员打算在他们自己的事件中使用 event_dispatch 服务。

关于php - 使用 Symfony 2 事件调度器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21175119/

10-15 18:11