Symfony表单提交时Request $request失效 redirect传入null报错
问题排查与修复方案
问题1:$referer为null报错原因
你当前使用$request->query->get('referer')是从URL的查询参数中获取referer,只有访问地址显式携带?referer=xxx参数时才会有值。标准HTTP来源地址存储在请求头中,正确获取方式如下,同时可以设置默认值避免为空:
// 第二个参数为默认值,Referer头为空时默认跳转到首页,避免传null报错 $referer = $request->headers->get('referer', $this->generateUrl('events'));
问题2:跳转到/后不进入表单提交判断的原因
属于逻辑设计错误:
- Symfony表单默认用POST方式提交,你拿到表单数据后执行redirect,本质是触发了一次全新的GET请求,新请求中没有任何表单提交数据,
handleRequest自然检测不到提交行为,不会进入if分支 - 存储在当前请求生命周期中的
$start、$end变量会随着请求结束销毁,跳转到首页后两个值会重置为null,完全达不到传递参数的效果
正确逻辑修改方案
筛选表单提交后不需要做跳转,校验通过后直接用筛选条件查询活动、渲染模板即可,修改后的控制器代码如下:
class EventController extends AbstractController { /** * @Route("/", name="events") * @param Request $request * @return Response */ public function index(Request $request): Response { $start = null; $end = null; $repository = $this->getDoctrine()->getRepository(Event::class); $eventFilterForm = $this->createForm(EventFilterType::class, []); $eventFilterForm->handleRequest($request); if ($eventFilterForm->isSubmitted() && $eventFilterForm->isValid()) { $start = $eventFilterForm->get('start_date')->getData(); $end = $eventFilterForm->get('end_date')->getData(); // 用筛选条件查询符合要求的活动 $events = $repository->createQueryBuilder('e') ->where('e.start_date >= :start') ->andWhere('e.start_date <= :end') ->setParameter('start', $start) ->setParameter('end', $end) ->orderBy('e.start_date', 'ASC') ->getQuery() ->getResult(); } else { // 未提交或校验不通过时查询全部活动 $events = $repository->findBy([], ['start_date' => 'ASC']); } return $this->render('event/index.html.twig', [ 'eventFilterForm' => $eventFilterForm->createView(), 'events' => $events, 'end' => $end, 'start' => $start, ]); } }
如果需要实现地址栏带筛选参数、方便用户分享链接的效果,可以把筛选参数拼到跳转URL的查询参数中,再在控制器里优先读取查询参数做筛选即可。
内容的提问来源于stack exchange,提问作者madebyjo_l
相关产品推荐
相关产品推荐

