在 Symfony 中使用 form_end 导致内部服务器错误

Using form_end in Symfony causes Internal server error

我最近清理了我的 Twig 模板,以避免对 Symfony 2.8 的弃用调用,但我遇到了一个奇怪的行为。

我的模板是这样的:

{{ form_start(form, {'attr': {'class': 'form_template'} }) }}
    {{ form_widget(form) }}
    <input type="submit" value="Send"/>
{{ form_end(form) }}

我的表单是这样的:

class MyFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('email', 'text', array('label' => 'your email'));
    }

    public function getName()
    {
        return 'some_fancy_name';
    }
}

这就是我的控制器的样子

public function someAction(Request $request)
{
    $form = $this->createForm(new MyFormType(), null);

    if ($request->getMethod() == 'POST') 
    {
        // do something with the form contents
        return $this->redirect($this->generateUrl('somewhere'));
    }
    return $this->render('::myform.html.twig', array(
        'form' => $form->createView(),
    ));
}

渲染模板时,一切正常,直到 Twig 渲染 form_end() 函数然后抛出 Error: Maximum function nesting level of '100' reached, aborting! (500 Internal Server Error)

我尝试在我的 PHP 配置中增加 xdebug.max_nesting_level 设置,但它没有帮助,我找到的唯一解决问题的方法是:

{{ form_start(form, {'attr': {'class': 'form_template'} }) }}
    {{ form_widget(form) }}
    <input type="submit" value="Send"/>
    {{ form_rest(form) }}
</form>

这是一个丑陋的修复。

现在我想知道为什么 form_end(form) 会出现这样的错误,而 form_rest(form) 却一切正常?

form_widget(form) 递归呈现整个表单,如 documentation on form collections 中所示,并导致服务器超过最大嵌套级别。手动渲染每个字段解决了这个问题。

此外,根据 documentation on form functions and variables,调用 form_end(form) 会调用 form_rest(form),所以当这不是必需的时候,我不得不手动禁用其余渲染以完全解决这个问题。 =16=]

我必须将我的 Twig 模板更改为以下内容:

{{ form_start(form, {'attr': {'class': 'form_template'} }) }}
    {{ form_row(form.email) }}
    <br/>
    <input type="submit" value="Send"/>
{{ form_end(form, {'render_rest': false}) }}