我有一个模板,我在其中呈现包含表单的小部件:
{{ render(controller('ApplicationDemoBundle:Demo:newWidget', {'demo' : entity })) }}
newWidgetAction调用createAction:
public function createAction(Request $request)
{
$entity = new Demo();
$form = $this->createCreateForm($entity);
$form->handleRequest($request);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('demo_show', array('id' => $entity->getId())));
}
return array(
'entity' => $entity,
'form' => $form->createView(),
)
// Something like this would be awesome with passing the form containing errors with
// return $this->redirect($this->getRequest()->headers->get('referer'));
}
想象一下,提交的表单(用户在show主题中的行为)会产生错误。这将返回到不显示完整布局的newWidget模板。
我现在的问题是:将错误从子控制器(newWidget)传递到主模板(show)的正确方法是什么?,而不修改showActions函数参数来传递前面的错误。
这个问题有一个类似的主题:Symfony2 render and form 在这种使用会话的情况下,如果这是可行的话,我不仅仅是好奇。
答案 0 :(得分:2)
问题是每个片段(子控制器)都使用虚拟请求。这是为了保护原始请求免受可能意外转发的修改,并且片段在呈现阶段基本上是向前发生的。
可以使用以下方式访问顶级请求:
$this->container->get('request');
然后将请求与片段中的表单一起处理,但如果每页使用多个表单,这可能会非常快速地混淆。
我的策略是遵循一个约定,将页面上经过验证的表单数量限制为一个。任何其他表单都不需要验证,否则表单不可能被错误地提交(黑客表单会引发服务器端异常,但用户应该只看到那些是否是顽皮)。
尝试构建模板继承以适应表单导航,同时始终显示大多数相同的布局和数据。您可以通过扩展片段的使用来实现这一点,这可以分离您的显示逻辑。