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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:06:02