我想分离表单验证逻辑:

public function contactAction()
{
    $form = $this->createForm(new ContactType());

    $request = $this->get('request');
    if ($request->isMethod('POST')) {
        $form->submit($request);
        if ($form->isValid()) {
            $mailer = $this->get('mailer');
            // .. setup a message and send it

            return $this->redirect($this->generateUrl('_demo'));
        }
    }

    return array('form' => $form->createView());
}

我想翻译成2个单独的 Action :
public function contactAction()
{
    $form = $this->createForm(new ContactType());
    return array('form' => $form->createView());
}

public function contactSendAction()
{
    $form = $this->createForm(new ContactType());
    $request = $this->get('request');
    if ($request->isMethod('POST')) {
        $form->submit($request);
        if ($form->isValid()) {
            $mailer = $this->get('mailer');
            // .. setup a message and send it using

            return $this->redirect($this->generateUrl('_demo'));
        }
    }
    // errors found - go back
    return $this->redirect($this->generateUrl('contact'));
}

问题是,当表单中存在错误时-进行表单验证并重定向后,contactAction中将不显示。 (可能在重定向后它们已经被忘记了-错误上下文将丢失)

最佳答案

如果检查CRUD generator生成的代码如何处理此问题,您将看到失败的表单验证不会返回重定向,而是使用与GET方法相同的 View 。因此,在您的示例中,您将:

return $this->render("YourBundle:Contact:contact.html.twig", array('form' => $form->createView()))

而不是返回重定向。这意味着您不会像在重定向中那样丢失表格错误。 CRUD生成器还添加了Method requirement,这意味着您可以指定ContactSendAction需要POST方法,因此不需要额外的if($request->isMethod('POST')){语句。

如果您在其他地方指定模板,也可以只返回一个数组,例如,可以使用@Template annotation然后
return array('form' => $form->createView())

关于Symfony 2-单独的表单逻辑,重定向后显示表单错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17269844/

10-12 00:02
查看更多