2017-12-15 12 views
0

우선 순위가 가장 높은 리스너를 구현했습니다. 헤더 값에 따라 사용자가 내 서버에서 리디렉션됩니다.리디렉션에서 모든 onKernelResponse를 실행하는 것을 리디렉션하고 방지하는 방법은 무엇입니까?

많은 사용자에게 영향을주기 때문에 다른 모든 수신기가 실행되기 전에 리디렉션을 실행하고 싶습니다. 특히 해당 수신기의 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. : 나는

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

를 추가하는 시도하지만 일반 응답 객체가 아닌 RedirectResponse 개체를 얻을 수 있기 때문에 작동하지 않습니다.

답변

0

비록 이것이 최선의 해결책인지 확실하지 않지만, onKernelResponse 이벤트에서 같은 헤더를 다시 확인하는 것이 효과가 있습니다.

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

인 stopPropagation의()를 호출 로그에 보면, 여전히 리스너 클래스라고하지만, 다른 모든 onKernelResponse 방법의 코드를 실행 중지합니다.

다른 방법이나 해결책은 여전히 ​​환영 받고 있습니다.