3

在我的 Symfony2.2 应用程序中,我使用了一个 onKernelTerminate EventListener,以便在我的响应被呈现后我可以进行一些“繁重的”处理,以便用户获得更快的响应时间。

在我的控制器中,我在请求上设置了一个属性,以便当事件侦听器运行时,该属性可用于确定是否有某些内容以及要处理的内容。

这在我的开发环境和未启用 AppCache 的测试环境中完美运行。但是,一旦我启用 AppCache(在我的 app.php 中)——我想要这样做,因为我将它用于我所有的 HTTP 缓存——事件侦听器停止工作,因为我通过 onKernelTerminate 中的事件访问的请求似乎有一个空属性参数包。

我在控制器中设置的属性不适用于 PostResponseEvent 中的请求。

为什么AppCache会有这个效果?是否有另一种方法可以在我的控制器和可与 AppCache 一起使用的事件侦听器之间传递数据?

这是一段代码,您可以看到:

#in my controller
$request->attributes->set('listener-to-process', 'test');


#in my EventListener:
public function onKernelTerminate(PostResponseEvent $event) {

    $request = $event->getRequest();

    //use this request attribute to decide what to process
    if (!$request->attributes->has('listener-to-process')) {
        return;
    };

    $type = $request->attributes->get('listener-to-process');
    $status = $this->api->persistTag(type);

    return;

}
4

2 回答 2

0

我找到了答案——我的困惑来自于不知道如何在单个请求中在服务之间传递信息。AppCache 有点像红鲱鱼(尽管我仍然不知道为什么它会重置对请求的更改)。

我认为唯一的方法是设置请求的属性,以便侦听服务可以从请求中提取。事实上,服务在请求中是持久的——所以服务本身可以在 onKernelTerminate 事件之后跟踪它需要做什么。

我创建了服务的私有属性(例如 $itemsToPersist),并在此过程中将项目添加到该数组中。

然后在监听器的 onKernelTerminate 方法中:

$service = $this->container->get('your_service');
$service->persistItems();

只需调用可以遍历 itemsToPersist 数组的方法并执行它需要执行的任何操作。

无需在请求中传递东西!

于 2014-02-27T12:31:45.767 回答
0

关于您的原始问题:这可能是因为 SymfonyHttpCache内核克隆了将传递给kernel.terminate事件的原始请求对象。因此,对克隆的请求对象所做的任何更改都不会出现在kernel.terminate事件中。见https://github.com/symfony/symfony/issues/23546

于 2017-07-20T14:49:39.613 回答