【问题标题】:Using form_end in Symfony causes Internal server error在 Symfony 中使用 form_end 会导致内部服务器错误
【发布时间】:2017-08-23 15:20:00
【问题描述】:

我最近清理了我的 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) 一切正常?

【问题讨论】:

  • 你不能得到更详细的错误信息吗?
  • documentation on embedded form collections 中有一条特别提到该消息的注释。 (我无法直接链接到它,只能搜索该页面上的消息。)
  • @t-n-y 我有一个,但它很长而且很痛苦@Don'tPanic 是的,我去过这个页面,但他们唯一鼓励的是增加xdebug.max_nesting_level
  • 如果您不显示所有信息,您希望我们如何帮助您,因为您认为这是“漫长而痛苦的”......
  • 好吧,如果您使用嵌套表单集合,它们确实提供了另一种增加该设置的替代方法。 "... 或使用 form_row" 手动呈现每个表单字段

标签: php symfony twig xdebug symfony-forms


【解决方案1】:

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

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

我不得不将我的 Twig 模板更改为以下内容:

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

【讨论】:

    猜你喜欢
    • 2011-01-08
    • 2013-07-14
    • 2016-12-21
    • 2020-04-19
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2013-08-11
    相关资源
    最近更新 更多