Symfony表单动态字段渲染报错:$view参数应为FormView却传入null
问题:Symfony动态表单字段渲染抛出类型错误
使用{{ form(group_mapping_form) }}可正常渲染表单,但通过{{ form_widget(attribute(group_mapping_form, 'use_code_' ~ group.id)) }}访问动态生成的表单字段时,出现如下错误:
Uncaught PHP Exception TypeError: "Symfony\\Component\\Form\\FormRenderer::searchAndRenderBlock(): Argument #1 ($view) must be of type Symfony\\Component\\Form\\FormView, null given
相关代码片段
PHP控制器(部分代码)
$form = $this->createFormBuilder(); $groups = json_decode($response->getContent()); foreach ($groups as $group) { $form->add('use_code_' . $group->id, ChoiceType::class, [ 'choices' => [ 'Select One' => [ 'none' => '', 'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D', 'E' => 'E', 'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J', ], ], ]); } $form->add('submit', SubmitType::class, ['label' => 'Submit']); $form = $form->getForm(); return $this->render('group_mapping_form.html.twig', [ 'group_mapping_form' => $form->createView(), 'groups' => $groups ?: '', ]);
Twig模板文件
{% extends "base.html.twig" %} {% block stylesheets %} {{ parent() }} <link href="{{ asset('css/table.css') }}" rel="stylesheet"/> {% endblock %} {% block body %} {% if group_mapping_form is not empty %} {{ form_start(group_mapping_form) }} <table class="styled-table"> <thead> <tr> <th>Group Name</th> <th>Entity Use Code</th> </tr> </thead> <tbody> {% if groups is not empty %} {% for group in groups %} <tr> <td> <div class="cell-border">{{ group.name }}</div> </td> <td> <div class="cell-border">{{ form_widget(attribute(group_mapping_form, 'use_code_' ~ group.id)) }}</div> </td> </tr> {% endfor %} {% else %} <tr> <td>No Records Found!</td> </tr> {% endif %} </tbody> </table> {{ form_widget(form.submit) }} {{ form_end(group_mapping_form) }} {% endif %} {% endblock %}
错误原因分析
- 空值处理逻辑错误:控制器中当
groups为空时,将其赋值为空字符串'',但Twig的{% if groups is not empty %}会把空字符串判定为非空,进入循环后group变量不存在,group.id为null,拼接出的字段名是use_code_,该字段不存在,导致attribute函数返回null,传给form_widget时触发类型错误。 - 提交按钮变量错误:Twig中渲染提交按钮时使用了未定义的
form变量,正确变量应为group_mapping_form,这会引发额外错误。 - 潜在字段名不匹配风险:若
group.id存在类型差异(如控制器中为数值、Twig中拼接为字符串),也可能导致字段查找失败,但这不是当前问题的主因。
解决方法
1. 修复groups空值赋值
控制器中把空groups赋值为空数组而非空字符串,确保Twig能正确判断空状态:
return $this->render('group_mapping_form.html.twig', [ 'group_mapping_form' => $form->createView(), 'groups' => $groups ?: [], // 改为空数组 ]);
2. 修正提交按钮渲染变量
将Twig中的form.submit改为group_mapping_form.submit:
{{ form_widget(group_mapping_form.submit) }}
3. 添加字段存在性检查(可选)
为避免个别异常group.id导致的错误,可在Twig中先检查字段是否存在再渲染:
<div class="cell-border"> {% set field = attribute(group_mapping_form, 'use_code_' ~ group.id) %} {% if field is not null %} {{ form_widget(field) }} {% else %} <span>无效字段</span> {% endif %} </div>
内容的提问来源于stack exchange,提问作者FatGuyLaughing
相关产品推荐
相关产品推荐

