You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:30:53