Symfony2:onKernelResponse 调用两次作为 MASTER_REQUEST

Posted

技术标签:

【中文标题】Symfony2:onKernelResponse 调用两次作为 MASTER_REQUEST【英文标题】:Symfony2 : onKernelResponse called twice as MASTER_REQUEST 【发布时间】:2014-02-03 16:59:58 【问题描述】:

我正在使用事件监听器onKernelResponse

尽管我使用过:

if (HttpKernelInterface::MASTER_REQUEST != $event->getRequestType()) 
    return;

我的操作中有两次MASTER_REQUEST,在<!DOCTYPE html> <html> <head>etc 之前有一个,另一个在布局结束后例外。

他是我的services.yml

history.listener:
    class: VENDOR\MyBundle\Service\HistoryListener
    arguments: [@doctrine.orm.entity_manager, @logger, @history]
    tags:
        -  name: kernel.event_listener, event: kernel.controller, method: onKernelController 
        -  name: kernel.event_listener, event: kernel.response, method: onKernelResponse 

我是不是做错了什么?

【问题讨论】:

【参考方案1】:

终于找到问题的根源了:调试工具栏!

它实际上发送了一个ajax请求,意味着另一个MASTER_REQUEST..

我的解决方案是使用控制器名称的白/黑列表过滤控制器。

更新:

这是我正在使用的代码(因此您可以在需要时轻松排除其他一些控制器)。

public function __construct()

    $this->classesExcluded = array("Symfony\Bundle\WebProfilerBundle\Controller\ProfilerController");



public function onKernelController(FilterControllerEvent $event)

    $controller = $event->getController();

    if (!is_array($controller) || HttpKernelInterface::MASTER_REQUEST != $event->getRequestType() || in_array(get_class($controller[0]), $this->classesExcluded)) 
        return;
    
  // ...

【讨论】:

我最终这样做了 - strpos($event->getRequest()->attributes->get('_controller'), 'WebProfilerBundle') !== false 不知道这有多明智,但确实有效。 有时它是Symfony\Bundle\FrameworkBundle\Controller\RedirectController,所以您可能也想排除它。 在我的情况下,我有 Symfony\Bundle\TwigBundle\Controller\ExceptionController 第二次调用。我必须修复一个错误,然后一切正常。

以上是关于Symfony2:onKernelResponse 调用两次作为 MASTER_REQUEST的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 获取登录用户

Symfony2 无法连接到 sqlite

找不到 Symfony2 组件类

Symfony2 - 访问被拒绝

Symfony2 / SonataUserBundle - 注册后自动登录

Symfony2 OneToMany 关系