0

Goal : redirect a user depending on a status, on the whole website when the user is logged.

I need to force the user to be on one page until he has changed his profile So i try to make a redirection with the event kernel but i've got an infinite loop. however I tried to avoid doing this redirection once the page wanted

So please find what i try to do

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',
        );
    }

}
Stephan Vierkant
  • 9,674
  • 8
  • 61
  • 97
iometrine
  • 41
  • 11

3 Answers3

1

Now the redirection works but when the page is loaded all my css et javascript are not loader , because the redirection i think. I work just in the kernel response.

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));

    }
}
iometrine
  • 41
  • 11
0

You could try this, but using ->get('_route') should normally only be used for debugging. You should dump the Event and the Response to find out what else you can use.

public function onKernelRequest(GetResponseEvent $event)
    if($event->getRequest()->get('_route') != 'user_index'){
        $event->setResponse(new Response('[NOT_ALLOWED]'));
    }
}
Vyctorya
  • 1,387
  • 1
  • 12
  • 18
  • Hi Vyctoyra, it's a good idea but when i do this i have a status code error 302 Fatal error: Uncaught RuntimeException: Error when rendering "http://127.0.0.1:8000/fr/page1/" (Status code is 302). Maybe it's because i rendering some form by controller action ? but i don't know what to do – iometrine Oct 17 '18 at 09:21
  • Maybe you need to return a redirect? $event->setResponse(new RedirectResponse('user_index')); – Vyctorya Oct 17 '18 at 10:14
  • it's what i did, but i have always infinite loop – iometrine Oct 17 '18 at 10:18
  • What do you get from var_dump($event->getRequest()->get('_route')); die(); – Vyctorya Oct 17 '18 at 10:20
  • i've got a null – iometrine Oct 17 '18 at 12:07
0

This should solve your issue

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;
    }
}
hanish singla
  • 782
  • 8
  • 21