渲染控制器并从子级获取表单错误

时间:2013-11-10 23:35:46

标签: symfony symfony-forms

我有一个模板,我在其中呈现包含表单的小部件:

{{ 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 在这种使用会话的情况下,如果这是可行的话,我不仅仅是好奇。

1 个答案:

答案 0 :(得分:2)

问题是每个片段(子控制器)都使用虚拟请求。这是为了保护原始请求免受可能意外转发的修改,并且片段在呈现阶段基本上是向前发生的。

可以使用以下方式访问顶级请求: $this->container->get('request');然后将请求与片段中的表单一起处理,但如果每页使用多个表单,这可能会非常快速地混淆。

我的策略是遵循一个约定,将页面上经过验证的表单数量限制为一个。任何其他表单都不需要验证,否则表单不可能被错误地提交(黑客表单会引发服务器端异常,但用户应该只看到那些是否是顽皮)。

尝试构建模板继承以适应表单导航,同时始终显示大多数相同的布局和数据。您可以通过扩展片段的使用来实现这一点,这可以分离您的显示逻辑。