2017-12-15 18 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.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

これは最高の解決策であるかどうかはまだ分かりませんが、onKernelResponseイベントで同じヘッダーを再度確認することはできました。

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

のstopPropagationの呼び出しは()あなたがログに見れば、まだすべてのリスナクラスが呼び出されるが、他のすべてのonKernelResponseメソッドのコードの実行を停止します。

他のアプローチや解決策はまだあります。

関連する問題