Symfony 2 - 单独的表单逻辑,重定向后显示表单错误

ple*_*ock 12 symfony-forms symfony

我想分离表单验证逻辑:

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());
}
Run Code Online (Sandbox Code Playgroud)

我想翻译成两个单独的行动:

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'));
}
Run Code Online (Sandbox Code Playgroud)

问题是当表单中存在错误时 - 在表单验证和重定向之后,不会在contactAction中显示.(可能它们在重定向后已经被遗忘 - 错误上下文将丢失)

Luk*_*uke 5

如果您查看CRUD生成器生成的代码如何处理此问题,您将看到失败的表单验证不返回重定向,而是使用与该GET方法相同的视图.所以在你的例子中你只会:

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

而不是返回重定向.这意味着您不会像重定向一样丢失表单错误.CRUD生成器添加的其他内容是方法要求,这意味着您可以指定ContactSendAction需要POST方法,因此不需要额外if($request->isMethod('POST')){语句.

如果在其他地方指定模板,也可以只返回一个数组,例如,您可以使用@Template注释然后只是

return array('form' => $form->createView())
Run Code Online (Sandbox Code Playgroud)