【问题标题】:symfony 3.4 redirect a user on a page depending on his statussymfony 3.4 根据用户的状态在页面上重定向用户
【发布时间】:2018-10-16 20:09:08
【问题描述】:

目标:当用户登录时,在整个网站上根据状态重定向用户。

我需要强制用户在一个页面上,直到他更改了他的个人资料 所以我尝试使用事件内核进行重定向,但我有一个无限循环。但是,一旦页面需要,我尝试避免执行此重定向

所以请找出我尝试做的事情

class TokenSubscriber implements EventSubscriberInterface {

    private $user;
    private $tokenStorage;
    private $router;
    protected $redirect;

    public function __construct(TokenStorageInterface $tokenStorage, RouterInterface $router
    ) {
        $this->tokenStorage = $tokenStorage;
        $this->router = $router;
    }

    public function onKernelController(FilterControllerEvent $event) {
        $controller = $event->getController();


        if (!is_array($controller)) {
            return;
        }

        $this->user = $this->tokenStorage->getToken()->getUser();


        if ($this->user->getValider() == 3 && $controller[1] == 'indexUserAction' && $controller[0] instanceof DefaultUserController) {
            $this->redirect = null;
        } else {
            $this->redirect = 'user_index';
        }
    }

    public function onKernelResponse(FilterResponseEvent $event) {
        if (null !== $this->redirect) {
            $url = $this->router->generate($this->redirect);
            $event->setResponse(new RedirectResponse($url));
        }
    }

    public static function getSubscribedEvents() {
        return array(
            KernelEvents::CONTROLLER => 'onKernelController',
            KernelEvents::RESPONSE => 'onKernelResponse',
        );
    }

}

【问题讨论】:

    标签: symfony redirect events controller symfony-http-kernel


    【解决方案1】:

    现在重定向有效,但是当页面加载时,我所有的 css et javascript 都不是加载器,因为我认为重定向。 我只在内核响应中工作。

    public function onKernelResponse(FilterResponseEvent $event){
        if ($event->getRequest()->get('_route') != null &&  $event->getRequest()->get('_route') != 'user_index') {
    
            $url = $this->router->generate('user_index');
            $event->setResponse(new RedirectResponse($url));
    
        }
    }
    

    【讨论】:

      【解决方案2】:

      你可以试试这个,但是使用 ->get('_route') 通常应该只用于调试。您应该转储事件和响应以找出您可以使用的其他内容。

      public function onKernelRequest(GetResponseEvent $event)
          if($event->getRequest()->get('_route') != 'user_index'){
              $event->setResponse(new Response('[NOT_ALLOWED]'));
          }
      }
      

      【讨论】:

      • 嗨 Vyctoyra,这是个好主意,但是当我这样做时,我有一个状态代码错误 302 致命错误:未捕获的 RuntimeException:渲染“127.0.0.1:8000/fr/page1”时出错(状态代码为 302)。也许是因为我通过控制器动作呈现了某种形式?但我不知道该怎么办
      • 也许您需要返回重定向? $event->setResponse(new RedirectResponse('user_index'));
      • 这是我做的,但我总是无限循环
      • 你从 var_dump($event->getRequest()->get('_route')) 中得到了什么;死();
      • 我有一个空值
      【解决方案3】:

      这应该可以解决您的问题

      public function onKernelController(FilterControllerEvent $event) {
          $controller = $event->getController();
      
          if (!is_array($controller)) {
              return;
          }
      
          $this->user = $this->tokenStorage->getToken()->getUser();
      
          if ($this->user->getValider() == 3 && $controller[1] == 'indexUserAction' && $controller[0] instanceof DefaultUserController) {
              $this->redirect = null;
          } else {
              $this->redirect = 'user_index';
          }
      
          // Add this to Empty redirect if on already same page
          if($event->getRequest()->get('_route') == 'user_index'){
              $this->redirect = null;
          }
      }
      

      【讨论】:

      • 谢谢,但它不起作用。我仍然是一个无限循环
      猜你喜欢
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多