在我的捆绑包中,我想利用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();
});
}
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
被触发时,不会调用此闭包。为什么?是因为它本身就是一个听众吗?
答案 0 :(得分: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>