Symfony页面刷新时表单数据重复入库问题求助
问题根源与修复方案
你的核心问题是重定向没有真正生效——虽然在addComment里写了return $this->redirectToRoute('app_comments'),但上层的indexAction完全没处理这个返回值,还是会执行到最后的return renderForm,导致浏览器收到的是页面渲染响应,而非重定向指令。刷新页面时,浏览器会重新发送之前的POST请求,自然就重复添加评论了。
具体修复步骤
1. 捕获重定向响应,终止原请求流程
在indexAction里调用addComment时,接收它的返回值,如果是Response类型,直接返回这个响应,中断后续代码执行:
// indexAction中修改调用addComment的代码 $redirectResponse = $this->addComment($commentForm, $comment, $user, $entityManager, $_POST['parent_id'] ?? null); // 若存在重定向响应,直接返回 if ($redirectResponse instanceof Response) { return $redirectResponse; }
2. 修复addComment里的逻辑错误
你的addComment还有两处逻辑问题,会导致部分属性设置失效:
$comment = $form->getData();会覆盖你之前设置的user、createdAt等属性,要把这行移到最前面- 避免直接用
$_POST取参数,改用Symfony规范的方式传递
修改后的addComment方法:
public function addComment($form, $comment, $user, EntityManagerInterface $entityManager, ?int $parentId = null) { if ($form->isSubmitted() && $form->isValid()) { // 先获取表单数据,再补充其他属性 $comment = $form->getData(); $comment->setUser($user); $comment->setCreatedAt(new \DateTime()); $comment->setParentId($parentId); $entityManager->persist($comment); $entityManager->flush(); return $this->redirectToRoute('app_comments'); } return null; }
3. 优化参数传递(可选)
把$_POST['parent_id']换成从Request对象获取,更符合Symfony开发规范:
// indexAction中获取parent_id $parentId = $request->request->get('parent_id'); $redirectResponse = $this->addComment($commentForm, $comment, $user, $entityManager, $parentId);
修复后的完整流程
当表单提交且验证通过时,addComment返回重定向响应,indexAction直接将其返回给浏览器,浏览器会发送GET请求到app_comments路由。此时页面基于GET请求加载,刷新时只会重复GET请求,不会再触发表单提交,彻底解决重复添加数据的问题。
内容的提问来源于stack exchange,提问作者Officer Pulaski
相关产品推荐
相关产品推荐

