如何在事件侦听器中利用kernel.terminate

sf_*_*anb 2 symfony

在我的捆绑包中,我想利用该kernel.terminate事件来刷新有关webservice api调用的一些统计信息.然而,我没有找到任何资源以最好的方式做到这一点.

在一个监听器GuzzleExceptionListener(他的角色是拦截每个失败的webservice调用)中我已经注入了EntityManger服务.:

if ($exception instanceof BadResponseException) {
    $entityManager = $this->entityManager;

    $dispatcher = new EventDispatcher;
    $dispatcher->addListener('kernel.terminate', function (Event $event) use ($entityManager) {
        $repository = $entityManager->getRepository("somerepository");
        // do some treatment for stats
        $entityManager->persist($apicall);
        $entityManager->flush();
    });
}
Run Code Online (Sandbox Code Playgroud)

宣言GuzzleExceptionListener:

<service id="my_service" class="%my_class%">
    <tag name="kernel.event_listener" event="kernel.exception" method="onKernelException" />
    <argument type="service" id="doctrine.orm.entity_manager" />
</service>
Run Code Online (Sandbox Code Playgroud)

无论如何,当事件kernel.terminate被触发时不会调用此闭包.为什么?是因为它本身就是听众吗?

Nic*_*ich 5

您应该注入symfony配置的事件调度程序service(@event_dispatcher),而不是在侦听器中创建新的事件调度程序.

如果您只创建它并添加一个事件监听器symfony仍然没有引用这个新创建的EventDispatcher对象,因此不会使用它.

<service id="my_service" class="%my_class%">
    <tag name="kernel.event_listener" event="kernel.exception" method="onKernelException" />
    <argument type="service" id="doctrine.orm.entity_manager" />
    <argument type="service" id="event_dispatcher" />
 </service>
Run Code Online (Sandbox Code Playgroud)