如何重定向和阻止 运行 监听器中的所有 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 方法的代码,但如果您查看日志,仍然会调用所有侦听器 类。

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