嵌入式Twig控制器会导致kernel.request事件多次触发



在我的Symfony项目中,我遇到了一个奇怪的问题,当使用嵌入式Twig控制器时,kernel.request事件侦听器会多次触发。

在我的自定义事件侦听器中,我有一个事件侦听器,如果存在某个条件(在这种情况下是过期的密码),它会发送重定向响应。为了防止重定向循环,我检查了我们是否已经在页面上:

if ($event->getRequest()->get('_route') != 'user_change_password') {
$response = new RedirectResponse($this->router->generate('user_change_password'));
$event->setResponse($response);
}

但这并没有阻止重定向循环。在添加日志记录之前,我不知道嵌入式控制器会触发kernel.request事件(事后看来很明显,因为这些嵌入式控制器通过发送"子请求"来工作)。我有一个单独的嵌入式控制器,通过基本的树枝模板,检查任何警报消息并显示它们。

鉴于上述,我如何才能

  1. 能够将动态内容插入到基本模板(所有其他模板都扩展)中,AND
  2. 没有kernel.request事件侦听器多次激发

尽管Symfony建议使用嵌入式控制器将动态内容插入到基本模板中,但这被认为是一种糟糕的做法吗?

创建一个Twig扩展来解决这个问题会更好吗?据我所见,Twig扩展通常只用于简单的东西,比如食谱中的price示例,尽管我不明白为什么它不适用于更复杂的、与数据库连接的东西。我只是不知道该怎么做。

请举例说明。


可能相关?:Symfony控制器执行多次

只有当针对主请求执行事件侦听器时,才能执行重定向:

use SymfonyComponentHttpKernelHttpKernelInterface;
// ...
if ($event->isMasterRequest() && $event->getRequest()->get('_route') != 'user_change_password') {
$response = new RedirectResponse($this->router->generate('user_change_password'));
$event->setResponse($response);
}

如果您仍然绑定到Symfony 2.3,您可以使用getRequestType()方法将其返回值与HttpKernelInterface中的MASTER_REQUEST常量进行比较(这就是isMasterRequest()在内部所做的):

use SymfonyComponentHttpKernelHttpKernelInterface;
// ...
if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType() && $event->getRequest()->get('_route') != 'user_change_password') {
$response = new RedirectResponse($this->router->generate('user_change_password'));
$event->setResponse($response);
}

相关内容

最新更新