Events 嵌入式细枝控制器导致kernel.request事件多次触发

Events 嵌入式细枝控制器导致kernel.request事件多次触发,events,symfony,twig-extension,Events,Symfony,Twig Extension,在我的Symfony项目中,我遇到了一个关于内核的奇怪问题。request在使用时多次触发 在我的自定义事件侦听器中,我有一个事件侦听器,如果存在某个条件(在本例中是过期密码),它将发送重定向响应。为了防止重定向循环,我检查了我们是否已经在页面上: if ($event->getRequest()->get('_route') != 'user_change_password') { $response = new RedirectResponse($this->rou

在我的Symfony项目中,我遇到了一个关于
内核的奇怪问题。request在使用时多次触发

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

if ($event->getRequest()->get('_route') != 'user_change_password') {
    $response = new RedirectResponse($this->router->generate('user_change_password'));
    $event->setResponse($response);
}
但这并没有阻止重定向循环。在我添加日志记录之前,我不知道嵌入式控制器会触发
kernel.request
事件(事后看来很明显,因为这些嵌入式控制器通过发送“子请求”来工作)。我在by base twig模板中有一个嵌入式控制器,用于检查并显示任何警报消息

鉴于上述情况,我如何

  • 能够将动态内容插入基础模板(所有其他模板都扩展),以及
  • 没有
    内核。请求
    事件侦听器多次激发
  • 尽管Symfony建议使用嵌入式控制器将动态内容插入到基本模板中,但这被认为是不好的做法吗

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

    请举例说明



    可能相关?:

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

    use Symfony\Component\HttpKernel\HttpKernelInterface;
    
    // ...
    
    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\u请求
    常量进行比较(这就是
    isMasterRequest()
    在内部的作用):


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

    use Symfony\Component\HttpKernel\HttpKernelInterface;
    
    // ...
    
    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\u请求
    常量进行比较(这就是
    isMasterRequest()
    在内部的作用):


    答对 了这就是我喜欢的解决方案:快速简单。非常感谢。不过有一件事:在Symfony3中,该方法显然已重命名为
    $event->getRequestType()
    。另外,完整的名称空间(对于
    use
    语句)是
    Symfony\Component\HttpKernel\HttpKernelInterface
    。我深入到源代码中,找到了一种更简单的方法。有一个名为
    isMasterRequest()
    的事件方法,它在答案中进行精确的requestType比较。不确定这是什么时候添加到Symfony的,但它是首选解决方案。你说得对。Symfony 2.4中介绍了该方法。我再次更新了我的答案,以防将来有人在这个问题上绊倒。答对了!这就是我喜欢的解决方案:快速简单。非常感谢。不过有一件事:在Symfony3中,该方法显然已重命名为
    $event->getRequestType()
    。另外,完整的名称空间(对于
    use
    语句)是
    Symfony\Component\HttpKernel\HttpKernelInterface
    。我深入到源代码中,找到了一种更简单的方法。有一个名为
    isMasterRequest()
    的事件方法,它在答案中进行精确的requestType比较。不确定这是什么时候添加到Symfony的,但它是首选解决方案。你说得对。Symfony 2.4中介绍了该方法。我再次更新了我的答案,以供将来遇到问题的人参考。kernel.request会针对每个请求激发,这包括{{render(controller(''''))}这样的子请求,这就是我所说的。我试图找到我上面解释的问题的解决方案,xabbuh善意地为每个请求提供了.kernel.request,这包括{{render(controller(''''))}}这样的子请求,我就是这么说的。我试图找到一个解决我上面解释的问题的方法,xabbuh很好心地提供了这个方法。