Как перенаправить и предотвратить запуск всех onKernelResponse в Listeners?

Я реализовал прослушиватель с наивысшим приоритетом, который в зависимости от значения заголовка перенаправляет пользователя с моего сервера.

Поскольку это влияет на многих пользователей, я хотел бы выполнить перенаправление до того, как будут запущены все остальные слушатели, особенно также 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.


person Calamity Jane    schedule 15.12.2017    source источник


Ответы (1)


Что сработало, хотя я до сих пор не уверен, что это лучшее решение, чтобы снова проверить тот же заголовок в событии onKernelResponse.

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

Вызов stopPropagation() останавливает выполнение кода всех других методов onKernelResponse, хотя, если вы посмотрите в журнале, все равно вызываются все классы слушателей.

Поэтому любой другой подход или решение по-прежнему приветствуется.

person Calamity Jane    schedule 15.12.2017