如何重定向和阻止 运行 监听器中的所有 onKernelResponse?
How to redirect and prevent running all onKernelResponse in Listeners?
我实现了一个具有最高优先级的侦听器,它根据 header 值将用户从我的服务器重定向。
因为这会影响很多用户,所以我想在所有其他听众 运行 广告之前执行重定向,尤其是那些听众的 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));
}
}
注意重定向的工作原理,我只是想避免 运行ing 所有其他侦听器并触发例如在那里记录消息。
此时我不介意使用更残酷的方法进行重定向,而不关心 运行 任何更多代码。
有什么想法吗?
P.S。 :
我尝试添加
public function onKernelResponse(FilterResponseEvent $event)
{
$response = $event->getResponse();
if ($response instanceof RedirectResponse) {
$this->logger->notice(' We want to redirect');
$event->stopPropagation();
}
}
但它不起作用,因为我得到的是普通响应 object 而不是 RedirectResponse object。
虽然我仍然不确定这是否是最佳解决方案,但有效的方法是在 onKernelResponse 事件中再次检查相同的 header。
public function onKernelResponse(FilterResponseEvent $event)
{
$requestedWith = $this->requestStack->getCurrentRequest()->headers->get('x-header-myfeature');
if (!empty($requestedWith)) {
$event->stopPropagation();
}
}
调用 stopPropagation() 会停止 运行 所有其他 onKernelResponse 方法的代码,但如果您查看日志,仍然会调用所有侦听器 类。
所以仍然欢迎任何其他方法或解决方案。
我实现了一个具有最高优先级的侦听器,它根据 header 值将用户从我的服务器重定向。
因为这会影响很多用户,所以我想在所有其他听众 运行 广告之前执行重定向,尤其是那些听众的 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));
}
}
注意重定向的工作原理,我只是想避免 运行ing 所有其他侦听器并触发例如在那里记录消息。
此时我不介意使用更残酷的方法进行重定向,而不关心 运行 任何更多代码。
有什么想法吗?
P.S。 : 我尝试添加
public function onKernelResponse(FilterResponseEvent $event)
{
$response = $event->getResponse();
if ($response instanceof RedirectResponse) {
$this->logger->notice(' We want to redirect');
$event->stopPropagation();
}
}
但它不起作用,因为我得到的是普通响应 object 而不是 RedirectResponse object。
虽然我仍然不确定这是否是最佳解决方案,但有效的方法是在 onKernelResponse 事件中再次检查相同的 header。
public function onKernelResponse(FilterResponseEvent $event)
{
$requestedWith = $this->requestStack->getCurrentRequest()->headers->get('x-header-myfeature');
if (!empty($requestedWith)) {
$event->stopPropagation();
}
}
调用 stopPropagation() 会停止 运行 所有其他 onKernelResponse 方法的代码,但如果您查看日志,仍然会调用所有侦听器 类。
所以仍然欢迎任何其他方法或解决方案。