Symfony中如何携带搜索表单数据重定向路由?提示变量不存在
问题分析与解决方案
问题根源
使用redirectToRoute('events', $data)时,会发起全新的GET请求,表单提交的$data会被转为URL查询参数,但你的events方法既没有读取Session中存储的搜索数据,也没有确保模板所需的所有变量都被传递。而直接用render时,$data直接传给了模板,刚好补上了缺失的category变量,但这跳过了路由的正常流程。
解决步骤
1. 修改events方法,读取Session中的搜索数据
既然已经把搜索数据存在Session里,就在events方法中获取这些数据,同时确保传递模板需要的所有变量:
#[Route('/events', name: 'events')] public function events( EventsRepository $eventsRepository, CategoriesRepository $categoriesRepository, SessionInterface $sessionInterface ){ // 从Session获取搜索数据,默认空数组避免报错 $searchData = $sessionInterface->get('searchFormData', []); // 根据搜索条件筛选活动(如果需要实现搜索功能) $events = $eventsRepository->findBySearchCriteria($searchData); // 传递模板所需的所有变量,包括可能用到的category return $this->render("front/events.html.twig", [ 'events' => $events, 'categories' => $categoriesRepository->findAll(), 'category' => $searchData['category'] ?? null ]); }
2. 简化search方法的重定向逻辑
因为搜索数据已经存在Session中,重定向时无需传递$data作为路由参数:
if ($form->isSubmitted() && $form->isValid()) { $data = $form->getData(); $sessionInterface->set('searchFormData', $data); // 直接重定向到events路由即可 return $this->redirectToRoute('events'); }
3. 补充活动筛选查询方法(可选)
如果需要实现按搜索条件过滤活动,在EventsRepository中添加查询方法:
// src/Repository/EventsRepository.php public function findBySearchCriteria(array $criteria) { $qb = $this->createQueryBuilder('e'); // 按分类筛选 if (!empty($criteria['category'])) { $qb->andWhere('e.category = :category') ->setParameter('category', $criteria['category']); } // 可扩展添加更多筛选条件(如关键词、日期等) return $qb->getQuery()->getResult(); }
4. 模板变量校验
检查front/events.html.twig中使用的变量名,确保和控制器传递的一致。如果模板中用的是category(单数),则控制器中传递$searchData['category'] ?? null即可;如果是复数categories,原代码已经传递了全部分类数据。
内容的提问来源于stack exchange,提问作者Emilie Tossan
相关产品推荐
相关产品推荐

