Symfony2/FosUserBundle - 获取登录前的上一条路线
Symfony2/FosUserBundle - Get the previous route before Login
我正在创建电子商务应用程序,并且正在使用处理程序构建自定义重定向。
假设我的用户在他的购物车上,但他没有登录。他验证了他的购物车以继续购买过程。在这种情况下,我的应用程序将用户重定向到登录页面。但是当他最终登录时,我想将他重定向到以前的路线(即购物车页面)。
(抱歉我的英语不好,希望你能理解我说的)
这是我的 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');
,但这不起作用。用户被重定向到登录页面(但身份验证工作正常)
所以我现在卡住了..
如果您需要更多代码来帮助我解决我的问题,请告诉我。
有什么线索或建议吗?
谢谢。
好吧,我找到了一个解决方案,我不知道它是否更好,但至少它是有效的。
因此:在我的侦听器中,我在会话对象中存储了一个属性,如果用户在我列表中的路径上,则更新此属性。
我的听众:
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;
}
用户正确登录后,您可以使用
获取引用者url
$this->getRequest()->headers->get('referer')
我正在创建电子商务应用程序,并且正在使用处理程序构建自定义重定向。
假设我的用户在他的购物车上,但他没有登录。他验证了他的购物车以继续购买过程。在这种情况下,我的应用程序将用户重定向到登录页面。但是当他最终登录时,我想将他重定向到以前的路线(即购物车页面)。 (抱歉我的英语不好,希望你能理解我说的)
这是我的 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');
,但这不起作用。用户被重定向到登录页面(但身份验证工作正常)
所以我现在卡住了..
如果您需要更多代码来帮助我解决我的问题,请告诉我。
有什么线索或建议吗?
谢谢。
好吧,我找到了一个解决方案,我不知道它是否更好,但至少它是有效的。
因此:在我的侦听器中,我在会话对象中存储了一个属性,如果用户在我列表中的路径上,则更新此属性。
我的听众:
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;
}
用户正确登录后,您可以使用
获取引用者url$this->getRequest()->headers->get('referer')