gpt4 book ai didi

symfony - 如何在事件监听器中利用 kernel.terminate

转载 作者:行者123 更新时间:2023-12-02 04:57:49 26 4
gpt4 key购买 nike

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

在监听器 GuzzleExceptionListener(他的作用是拦截每个失败的网络服务调用)上,我在其中注入(inject)了 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 时,不会调用此闭包。为什么 ?是因为它在监听器本身内部吗?

最佳答案

您应该注入(inject) 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>

关于symfony - 如何在事件监听器中利用 kernel.terminate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17671825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com