gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:56:39 25 4
gpt4 key购买 nike

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

在监听器GuzzleExceptionListener(他的作用是拦截每个失败的Web服务调用)上,我在其中注入(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/

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