【问题标题】:Render controller and get form errors from child渲染控制器并从孩子那里获取表单错误
【发布时间】:2013-11-10 23:35:45
【问题描述】:

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

{{ 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 在这种情况下使用会话,但我很好奇这是否是要走的路。

【问题讨论】:

    标签: symfony symfony-forms


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢您的回复。我认为将表单提交到顶层请求的想法非常有趣,如果建立了一个可靠的概念,甚至可以使用多个表单作为一个很好的实现。我想知道是否有人曾经为不止一种形式这样做过?但如果还有其他建议?但据我现在所见,我不同意您将经过验证的表单数量限制为一个的策略。如今,在单个页面上为用户提供的不仅仅是一种可能性已经很普遍了。为什么我们只能管理一个表单?
    • 这真的是一种做法,完全可以验证多个表单,就我所尝试的而言,没有“漂亮”的方法。
    • 这就是我在这里创建这篇文章的原因:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 2014-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 2020-06-17
    相关资源
    最近更新 更多