Symfony2:onKernelResponse两次调用MASTER_REQUEST

Bon*_*uar 6 master request filter listener symfony

我正在使用事件监听器onKernelResponse.

尽管我用过:

if (HttpKernelInterface::MASTER_REQUEST != $event->getRequestType()) {
    return;
}
Run Code Online (Sandbox Code Playgroud)

MASTER_REQUEST在我的动作中有两次,在<!DOCTYPE html> <html> <head>等之前有一次,而另一次在布局结束后排除.

他是我的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 }
Run Code Online (Sandbox Code Playgroud)

我做错什么了吗 ?

Bon*_*uar 9

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

它实际上发送一个ajax请求,意思是另一个MASTER_REQUEST..

我的解决方案是在Controller上进行过滤,使用控制器名称的白/黑列表.

更新:

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

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;
    }
  // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 我最终做到了这一点 - "strpos($ event-> getRequest() - > attributes-> get('_ controller'),'WebProfilerBundle')!== false`不确定它是多么明智但是诀窍. (2认同)