Symfony 4表单问题:无法获取提交的表单数据
解决Symfony 4表单提交后无法获取数据的问题
嘿,我看了你的代码,问题根源其实挺明显的,咱们一步步来修复:
核心问题:表单根本没被提交!
你模态框里的「Supprimer」按钮是个<a>标签,它只是跳转到删除路由,不会发送表单里的选择数据,所以控制器里的表单永远不会被标记为已提交。这是第一个要改的地方:
1. 把跳转链接改成表单提交按钮
打开你的Twig宏,把这段:
<a href="{{ deleteLink }}" class="btn btn-primary">Supprimer</a>
替换成表单提交按钮:
<button type="submit" class="btn btn-primary">Supprimer</button>
同时,要给表单指定正确的提交目标路由,修改form_start:
{{ form_start(form, {'action': deleteLink}) }}
2. 控制器里用正确的实体实例绑定表单
你在deleteGroupe方法里用new ParametresAdmin()来创建表单,这会导致表单数据无法正确映射到现有配置实体上。应该从数据库获取已有的ParametresAdmin实例:
public function deleteGroupe(Request $request, GroupeValidateurs $groupeValidateurs) { // 获取现有配置实例(假设是单条记录,根据你的实际情况调整查询) $parametresAdmin = $this->getDoctrine() ->getRepository(ParametresAdmin::class) ->findOneBy([]); $form = $this->createForm(DeleteDefaultGroupeType::class, $parametresAdmin, [ "groupeValidateursService" => $this->groupeValidateursService, ]); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { // 这里直接用$parametresAdmin就能拿到选中的新默认分组 $newDefaultGroupe = $parametresAdmin->getDefaultGroupeValidateurs(); // 先保存新的默认分组配置 $this->getDoctrine()->getManager()->flush(); // 再执行删除操作 $this->groupeValidateursService->removeGroup($groupeValidateurs); return $this->redirectToRoute("admin_validation_index"); } // 如果表单验证失败,返回模态框所在页面(或者处理错误) return $this->redirectToRoute("admin_validation_index"); }
3. 补充两个细节优化
- 指定请求方法:删除操作建议用POST请求,给路由加上方法限制:
同时在表单里明确方法:@Route("/admin/validation/delete/{id}", name="admin_validation_delete", methods={"POST"}){{ form_start(form, {'action': deleteLink, 'method': 'POST'}) }} - 确认CSRF令牌:Symfony表单默认启用CSRF保护,
form_end会自动渲染令牌字段,别手动删掉它。如果你的表单特意禁用了CSRF,需要在DeleteDefaultGroupeType的configureOptions里加上'csrf_protection' => false(不推荐这么做,除非有特殊需求)。
测试一下
改完这些之后,点击删除默认分组的按钮,弹出模态框选择新分组,然后提交,控制器就能正确获取到表单数据,执行后续的默认分组更新和旧分组删除操作了。
内容的提问来源于stack exchange,提问作者eronn
相关产品推荐
相关产品推荐

