12

我想分离表单验证逻辑:

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());
}

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

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 中。(重定向后它们可能已经被遗忘 - 错误上下文将丢失)

4

2 回答 2

5

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

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

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

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

return array('form' => $form->createView())
于 2013-06-24T10:13:14.613 回答
4

这在 Symfony 2.8 中似乎对我有用:

use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class MyController extends Controller {
    public function templateAction()
    {
        $form = $this->createForm(new MyFormType(), $myBoundInstance);

        if ($session->has('previousRequest')) {
            $form = $this->createForm(new MyFormType());
            $form->handleRequest($session->get('previousRequest'));
            $session->remove('previousRequest');
        }

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

    public function processingAction(Request $request)
    {

        $form = $this->createForm(new MyFormType(), $myBoundInstance);
        $form->handleRequest($request);

        if ($form->isValid()) {
            // do some stuff
            // ...

            return redirectToNextPage();
        }

        $session->set('previousRequest', $request);

        // handle errors
        // ...

        return redirectToPreviousPage();
    }
}

请注意redirectToNextPageredirectToPreviousPage以及MyFormType是伪代码。您必须用自己的逻辑替换这些位。

于 2016-01-20T10:29:51.367 回答