2016-04-21 59 views
3

我正在创建电子商务应用,并且正在使用Handler构建自定义重定向。Symfony2/FosUserBundle - 在登录前获取上一条路由

比方说,我的用户在他的购物车上,他没有登录。他验证他的购物车继续购买过程。在这种情况下,我的应用将用户重定向到登录页面。但是当他最终登录时,我想将他重定向到之前的路线(即购物车页面)。 (对不起,我的英文不好,我希望你能理解我说的)

这是我AuthentificationSuccessHandler:

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');喜欢我的文档中看到,但这不起作用。用户重定向到登录页面(但认证工作正常)

所以我卡住了现在..

告诉我,如果你需要更多的代码,以帮助我为我的问题。

任何线索或建议?

谢谢。

+0

这篇文章也许可以帮[http://stackoverflow.com/questions/32649157/reliably-redirect-to -last-accessible-page-in-symfony2] –

+0

谢谢。那么我想我会使用会话来存储路线。 – Letsrocks

回答

2

嗯,我找到了一个解决方案,我不知道这是更好的方法,但至少它的工作原理。

因此:进入我的监听器,我在会话的对象中存储一个属性,如果用户在列表中的路径上,则此属性更新。

我的听众:

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