重定向路由触发无限循环,寻求技术解决方案
解决重定向路由无限循环问题
嘿,我来帮你搞定这个无限重定向的坑!
你遇到的这个循环问题,根源其实很清晰:你的onKernelRequest监听器会拦截每一个请求,包括你重定向过去的accept_路由。也就是说,当用户被跳转到接受条件的页面时,监听器又会检查到用户还没接受条件,再次把他重定向回去,这样就形成了死循环。
解决方案:排除目标路由
我们只需要在判断逻辑里加一个例外——当用户当前访问的就是accept_路由时,不执行重定向操作。修改你的onKernelRequest方法如下:
/** * To checked all the routes * * @param GetResponseEvent $event */ public function onKernelRequest(GetResponseEvent $event) { // 先获取当前请求的路由名称 $currentRoute = $event->getRequest()->attributes->get('_route'); // 如果当前已经是接受条件的路由,直接跳过 if ($currentRoute === 'accept_') { return; } $user = $this->tokenStorage->getToken()->getUser(); if ($this->role->isGranted('ROLE_USER') && !$this->userManager->hasAccepted($user) ) { $this->redirect = $this->router->generate('accept_'); $event->setResponse(new RedirectResponse($this->redirect)); } }
额外优化建议
- 如果你以后可能需要排除多个路由,可以把这些路由名称放到一个配置数组里(比如在服务定义里注入),这样不用每次改代码:
// 假设你注入了$excludedRoutes数组 if (in_array($currentRoute, $this->excludedRoutes)) { return; } - 记得测试
hasAccepted方法的逻辑,确保用户完成条件接受后,这个方法能正确返回true,避免用户接受后还被重定向。
内容的提问来源于stack exchange,提问作者waner
相关产品推荐
相关产品推荐

