如何重定向并阻止在Listeners中运行所有onKernelResponse?

时间:2017-12-15 13:56:51

标签: symfony-2.8

我已经实现了一个具有最高优先级的侦听器,根据标头值将用户从我的服务器重定向。

由于这会影响很多用户,我希望在所有其他监听器运行之前执行重定向,尤其是那些监听器的onKernelResponse。

在我的重定向被调用的那一刻,有没有办法停止并重定向用户? 也许我可以重定向不使用RedirectResponse?但那怎么样?

public function onKernelRequest(GetResponseEvent $event)
{
    if (!$event->isMasterRequest()) {
        return;
    }

    $request = $this->requestStack->getCurrentRequest();
    $requestedWith = $request->headers->get('x-header-myfeature');
    if (!empty($requestedWith)) {
        $event->setResponse(new RedirectResponse($this->newUrltoRedirect));
    }
}

注意重定向工作,我只是想避免运行所有其他监听器并触发例如在那里记录消息。

我不介意在这一点上应用更加野蛮的方法来重定向,而无需再运行任何代码。

有什么想法吗?

P.S。 : 我尝试添加

public function onKernelResponse(FilterResponseEvent $event)
{
    $response =  $event->getResponse();
    if ($response instanceof RedirectResponse) {
        $this->logger->notice(' We want to redirect');
        $event->stopPropagation();
    }
}

但由于我得到一个普通的Response对象而不是RedirectResponse对象,所以它不起作用。

1 个答案:

答案 0 :(得分:0)

虽然我仍然不确定这是否是最佳解决方案,但是在onKernelResponse事件中再次检查相同的标头是什么。

public function onKernelResponse(FilterResponseEvent $event)
{
    $requestedWith = $this->requestStack->getCurrentRequest()->headers->get('x-header-myfeature');
    if (!empty($requestedWith)) {
        $event->stopPropagation();
    }
}

stopPropagation()的调用会停止运行所有其他onKernelResponse方法的代码,但是如果查看日志,仍会调用所有侦听器类。

所以任何其他方法或解决方案仍然受欢迎。