Symfony2/FOSUserBundle - Получить предыдущий маршрут перед входом в систему


Я создаю приложение для электронной коммерции и создаю пользовательское перенаправление с помощью обработчика.

Допустим, мой пользователь находится в корзине своих покупок, и он не зарегистрирован. Он проверяет свою корзину, чтобы продолжить процесс покупки. В этой ситуации Мое приложение перенаправляет пользователя на страницу входа в систему. Но когда он, наконец, войдет в систему, я хотел бы перенаправить его на предыдущий маршрут (т. Е. На страницу корзины). (Извините за мой плохой английский, я надеюсь, вы поймете, что я говорю)

Это мой Аутентификацияуспешный обработчик :

class AuthentificationSuccessHandler implements AuthenticationSuccessHandlerInterface
{
   protected $router;
   protected $security;

/**
 * AfterLoginRedirection constructor.
 * @param Router $router
 * @param AuthorizationChecker $security
 */
public function __construct(Router $router, AuthorizationChecker $security)
{
    $this->router = $router;
    $this->security = $security;
}


public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
    $session = $request->getSession();
    if ($this->security->isGranted('ROLE_SUPER_ADMIN')) {
        $response = new RedirectResponse($this->router->generate('_homepage_admin'));
    } else {
        $referer_url = $request->headers->get('referer');

        $response = new RedirectResponse($referer_url);
    }
    $session->getFlashBag()->add('success', 'Connexion réussi !');
    return $response;
}

Как вы можете видеть, я использую headers->get('referer');, как я видел в документации, но это не работает. Пользователь перенаправляется на страницу входа в систему (но аутентификация работает нормально)

Так что я застрял прямо сейчас..

Скажите мне, если вам нужно больше кода, чтобы помочь мне решить мою проблему.

Какие-нибудь подсказки или советы?

Спасибо.

Author: Letsrocks, 2016-04-21

1 answers

Что ж, я нашел решение, не знаю, лучше ли это, но, по крайней мере, оно работает.

Итак: в моем слушателе я сохраняю атрибут в объекте сеанса, этот атрибут обновляется, если пользователь находится на пути в моем списке.

Мой Слушатель :

class RedirectionListener
{

/**
 * RedirectionListener constructor.
 * @param ContainerInterface $container
 * @param Session $session
 */
public function __construct(ContainerInterface $container, Session $session)
{
    $this->session = $session ;
    $this->router = $container->get('router') ;
    $this->securityContext = $container->get('security.context') ;
}

/**
 * @param GetResponseEvent $event
 */
public function onKernelRequest(GetResponseEvent $event){
    $request        = $event->getRequest() ;
    $list_route     = array('_cart', '_category', '_delivery','_validate','_product','_homepage');
    $route          = $request->attributes->get('_route') ;
    $route_params   = $request->attributes->get('_route_params') ;

    if(in_array($route, $list_route)){
        $this->setRouteSession($request, $route, $route_params);
    }
    if($route == "_delivery" || $route =="_validate"){
        if ($this->session->has('cart')){
            if(count($this->session->get('cart')) == 0){
                $this->session->getFlashBag()->add('info', 'Votre panier étant vide, vous ne pouvez pas continuer le processus d\'achat ');
                $event->setResponse(new RedirectResponse($this->router->generate('_cart')));
            }
        }
        if(!is_object($this->securityContext->getToken()->getUser())){
            $this->session->getFlashBag()->add('info', 'Vous devez vous identifier');
            $event->setResponse(new RedirectResponse($this->router->generate('fos_user_security_login')));
        }
    }
}

/**
 * @param $request
 * @param $route
 * @param null $param
 */
private function setRouteSession($request, $route, $param){
    $session = $request->getSession() ;
    $session->set('lastPath', array(
        'route' => $route,
        'params' => $param
    ));
  }
}

Мой Куратор :

public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
    $session = $request->getSession();
    if(!$session->has('lastPath')){
        $route = '_homepage';
    } else {
        $route = $session->get('lastPath') ;
    }

    if ($this->security->isGranted('ROLE_SUPER_ADMIN')) {
        $response = new RedirectResponse($this->router->generate('_homepage_admin'));
    } else {
        if($route['params'] != null){
            $response = new RedirectResponse($this->router->generate($route['route'],$route['params']));
        } else {
            $response = new RedirectResponse($this->router->generate($route['route']));
        }

    }
    $session->getFlashBag()->add('success', 'Connexion réussi !');
    return $response;
}
 2
Author: Letsrocks, 2016-04-21 20:18:14