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

Symfony 渲染控制器并从子级获取表单错误,symfony,symfony-forms,Symfony,Symfony Forms,我有一个模板,其中我呈现了一个小部件,其中包含一个表单: {{ render(controller('ApplicationDemoBundle:Demo:newWidget', {'demo' : entity })) }} newWidgetAction调用createAction: public function createAction(Request $request) { $entity = new Demo(); $form = $this->createC

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

{{ 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模板

我现在的问题是:在不修改showActions函数参数的情况下,将错误从子控制器(newWidget)传递到主模板(show)的正确方法是什么

这个问题有一个类似的线索:
在本例中,使用了会话,但我非常好奇这是否是解决问题的方法。

问题在于每个片段(子控制器)使用一个虚拟请求。这是为了保护原始请求不被可能意外的转发修改,而片段本质上是在呈现阶段发生的转发

可以使用以下方式访问顶级请求:
$this->container->get('request')然后用片段中的表单处理请求,但是如果每页使用多个表单,这可能会很快变得非常混乱

我的策略是遵循一个惯例,将页面上已验证表单的数量限制为一个。任何其他表单都不需要验证,或者表单提交不正确是不可能的(被黑客攻击的表单会抛出服务器端异常,但用户应该只在它们淘气的情况下看到这些异常)


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

非常感谢您的回复。我认为将表单交给顶级请求的想法非常有趣,如果建立了一个可靠的概念,甚至可以将多个表单作为一个很好的实现。我想知道是否有人为了不止一张表格做过这种事?但如果还有其他建议呢?但就我现在所见,我不同意您将已验证表单的数量限制为一个的策略。如今,在一个页面上为用户提供不止一种可能性已经非常普遍。为什么我们只需要管理一个表单呢?这是一种实践,完全可以验证多个表单,就我所尝试的而言,没有“漂亮”的方法。这就是我在这里创建此帖子的原因:)