Symfony - 通过引用访问表单名称

Symfony - Access form name by reference

我有一个包含许多问题的表格。它们不依赖于实体,因此以 class

形式动态生成
class QuestionnaireType extends AbstractType
{
    private $questions = [
        0 => 'Question 1',
        1 => 'Question 2',
        2 => 'Question 3',
    ];

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        foreach ($this->questions as $key => $val) {
            $builder->add($key, ChoiceType::class, [
                'choices' => [
                    1 => 'Yes',
                    2 => 'No',
                ]
            ]);
        }
    }
}

我想循环访问我的 twig 模板中的这些表单元素。我尝试了以下但它不起作用:

{% block content %}
    {{ form_start(form) }}
    {{ form_errors(form) }}
    {% for i in 0..2 %}
        {{ form_label(form.i) }}
        {{ form_widget(form.i) }}
    {% endfor %}
    {{ form_end(form) }}
{% endblock %}

是否可以从 twig 模板中通过引用访问表单元素?

form.i 不起作用,因为您没有名为 i 的表单字段,并且当通过 foo.bar 访问数组或对象属性时,Twig 不会尝试解释 bar作为变量。

也就是说,您还可以通过语法 foo[bar] 访问数组键和对象属性,其中 bar 将始终 被解释为变量,并且其中 foo['bar'] 将等同于 foo.bar.
所以在你的情况下,form[i].

所以这应该适用于您的情况:

{% block content %}
    {{ form_start(form) }}
    {{ form_errors(form) }}
    {% for i in 0..2 %}
        {{ form_label(form[i]) }}
        {{ form_widget(form[i]) }}
    {% endfor %}
    {{ form_end(form) }}
{% endblock %}

另一个解决方案是使用 attribute 函数:

{% block content %}
    {{ form_start(form) }}
    {{ form_errors(form) }}
    {% for i in 0..2 %}
        {{ form_label(attribute(form, i)) }}
        {{ form_widget(attribute(form, i)) }}
    {% endfor %}
    {{ form_end(form) }}
{% endblock %}