在 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}) }}
我最近清理了我的 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}) }}