2

ここにあるkernel.requestイベントを使用しようとしています

私の例の簡略化されたバージョンは、リダイレクトされたページに既にいる場合を除き、ユーザーをリダイレクトすることです。私が見ている問題は、スタイルのないページを取得していることです。スタイルと js もリダイレクトされる可能性があるようです。

ここにコードがあります

services.yml

services:
    app.RequestListener:
        class: App\EventListener\RequestListener
        arguments: [ @security.context ]
        tags:
          - { name: kernel.event_listener, event: kernel.request, method: redirectUser }

requestListener.php

class requestListener
{
   public function redirectUser()
   {
      if($event->getRequest()->getPathInfo() != '/') {
         //app_frontend_home_index goes to '/'
         $event->setResponse(new RedirectResponse($this->router->generate('app_frontend_home_index')));
      }
   }
}

?test=dont_redirect を設定した場所でもこれを試しましたが、一度設定するとリダイレクトされません

   public function redirectUser()
   {
      if(is_null($event->getRequest()->get('test'))) {
         //app_frontend_home_index goes to '/'
         $event->setResponse(new RedirectResponse($this->router->generate('app_frontend_home_index', array('test' => 'dont_redirect'))));
      }
   }

私が提供したリンクのセクションを読んだ後、これは使用する正しいイベントのようです。それを機能させる方法はありますか?

4

2 に答える 2

0

これが私が最終的に行った解決策です。トークンが null でないことを確認することで、ルートをチェックする必要がなくなります。無限ループを防ぐために、GET パラメータのチェックを追加しました。例を完成させるために、ユーザーが試用期間よりも長くメンバーであるかどうかを確認する方法を示しました。そうであれば、価格設定ページにリダイレクトします。

うまくいけば、これが誰かにとって役立つことが証明されます.ギャップや改善の余地がある場合は、お気軽にお知らせください.

public function __construct(SecurityContext $securityContext, Router $router, $trialDays)
{
    $this->securityContext = $securityContext;
    $this->router          = $router;
    $this->trialDays       = $trialDays;
}

/**
 * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
 */
public function checkTrial(GetResponseEvent $event)
{
    if(!is_null($this->securityContext->getToken()) &&
        ($this->securityContext->isGranted('IS_AUTHENTICATED_FULLY') || 
        $this->securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED'))) {

        $memberDays = (int)$this->securityContext->getToken()->getUser()->getCreatedAt()->diff(new \DateTime)->format('%d');
        if($memberDays > $this->trialDays &&
           is_null($event->getRequest()->get('redirected'))) {

            $event->setResponse(new RedirectResponse($this->router->generate('app_frontend_pricing_index', array('redirected' => 'true'))));
        }
    }
}
于 2013-09-20T03:10:21.040 に答える