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

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 %}

错误原因分析

  1. 空值处理逻辑错误:控制器中当groups为空时,将其赋值为空字符串'',但Twig的{% if groups is not empty %}会把空字符串判定为非空,进入循环后group变量不存在,group.id为null,拼接出的字段名是use_code_,该字段不存在,导致attribute函数返回null,传给form_widget时触发类型错误。
  2. 提交按钮变量错误:Twig中渲染提交按钮时使用了未定义的form变量,正确变量应为group_mapping_form,这会引发额外错误。
  3. 潜在字段名不匹配风险:若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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:17:03