Symfony2 / FosUserBundle - 在登录前获取上一个路线

时间:2016-04-21 18:12:41

标签: php symfony fosuserbundle

我正在创建一个电子商务应用程序,我正在使用处理程序构建自定义重定向。

假设我的用户在购物车上,他没有登录。他验证了他的购物车继续购买过程。在这种情况下,我的应用程序将用户重定向到登录页面。但是当他最终登录时,我想将他重定向到之前的路线(即购物车页面)。 (抱歉我的英语很差,我希望你能理解我所说的)

这是我的AuthentificationSuccessHandler:

public double ComputeCorrelation(double[] x, double[] y, double[] meanX, double[] meanY)
        {
            if (x.Length != y.Length)
                throw new ArgumentException("values must be the same length");

            double sumNum = 0;
            double sumDenom = 0;
            double denomX = 0;
            double denomY = 0;

            for (int a = 0; a < x.Length; a++)
            {
                sumNum += (x[a] - meanX[a]) * (y[a] - meanY[a]);
                denomX += Math.Pow(x[a] - meanX[a], 2);
                denomY += Math.Pow(y[a] - meanY[a], 2);
            }

            var sqrtDenomX = Math.Sqrt(denomX);
            var sqrtDenomY = Math.Sqrt(denomY);

            if (sqrtDenomX == 0 || sqrtDenomY == 0) return 0;

            sumDenom = Math.Sqrt(denomX) * Math.Sqrt(denomY);

            var correlation = sumNum / sumDenom;

            return correlation;
        }

正如您所看到的,我使用MathNet.Numerics,就像我在文档中看到的那样,但这不起作用。用户重定向到登录页面(但验证工作正常)

所以我现在卡住了..

告诉我您是否需要更多代码来帮助解决我的问题。

任何线索或建议?

感谢。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

用户正确登录后,您可以使用来获取引荐来源网址

$this->getRequest()->headers->get('referer')