我已经实现了一个具有最高优先级的侦听器,根据标头值将用户从我的服务器重定向。
由于这会影响很多用户,我希望在所有其他监听器运行之前执行重定向,尤其是那些监听器的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对象,所以它不起作用。
答案 0 :(得分:0)
虽然我仍然不确定这是否是最佳解决方案,但是在onKernelResponse事件中再次检查相同的标头是什么。
public function onKernelResponse(FilterResponseEvent $event)
{
$requestedWith = $this->requestStack->getCurrentRequest()->headers->get('x-header-myfeature');
if (!empty($requestedWith)) {
$event->stopPropagation();
}
}
stopPropagation()的调用会停止运行所有其他onKernelResponse方法的代码,但是如果查看日志,仍会调用所有侦听器类。
所以任何其他方法或解决方案仍然受欢迎。