2

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

GuzzleExceptionListener在我注入服务的侦听器上(他的角色是拦截每个失败的 Web 服务调用) 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();
    });
}

的声明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>

无论如何,kernel.terminate触发事件时不会调用此闭包。为什么 ?是因为它在听众内部吗?

4

1 回答 1

5

你应该注入 symfony 配置的事件调度器服务(@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>
于 2013-07-16T14:28:51.430 回答