1

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

{{ 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'));
}

想象一下提交的表单(用户在显示主题中操作)产生错误。这将返回到不显示完整布局的 newWidget 模板。

我现在的问题是:将错误从子控制器 (newWidget) 传递到主模板 (show) 的正确方法是什么?无需修改 showActions 函数参数以将 formerrors 传递到那里。

这个问题有一个类似的线程:Symfony2 render and form 在这种情况下使用了会话,但我很好奇这是否是要走的路。

4

1 回答 1

2

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

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

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

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

于 2013-11-11T09:42:19.787 回答