Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 2-单独的表单逻辑,在重定向后显示表单错误_Symfony_Symfony Forms - Fatal编程技术网

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

Symfony 2-单独的表单逻辑,在重定向后显示表单错误,symfony,symfony-forms,Symfony,Symfony Forms,我想分离表单验证逻辑: public function contactAction() { $form = $this->createForm(new ContactType()); $request = $this->get('request'); if ($request->isMethod('POST')) { $form->submit($request); if ($form->isValid())

我想分离表单验证逻辑:

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

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

return $this->render("YourBundle:Contact:contact.html.twig", array('form' => $form->createView()))
而不是返回重定向。这意味着您不会像在重定向中那样丢失表单错误。CRUD生成器添加的其他内容是,这意味着您可以指定
ContactSendAction
需要
POST
方法,因此不需要额外的
if($request->isMethod('POST')){
语句

如果在别处指定模板,也可以只返回一个数组,例如,可以使用

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

这似乎在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();
    }
}

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

感谢您提供有关方法要求和使用返回视图而不是重定向的信息。但如果我改用视图,情况将是一样的事实上,-2个逻辑不再分离。是否有任何方法可以使用重定向和不丢失表单错误?重定向和不丢失表单数据似乎不是正确的想法。您可以在会话中设置错误并将其添加到表单中,但这充满了潜在的缺陷。通过逻辑分离,您试图摆脱什么?您可以如果您愿意,可以
返回$this->contactAction();
吗?很抱歉,我上次对return$this->contactAction()的评论;是我吐球,考虑不周幸运的是,这不是我想做的。如果没有简单的方法来传递表单错误,那么我可能不会将这两个逻辑分开。无论如何,谢谢!有趣的方法。我能看到的唯一缺点是,如果有错误,您会处理表单两次。您是否在使用t时遇到任何其他问题他在表单扩展/侦听器中提出了以前的请求吗?很遗憾,我没有在这种验证方法中使用过这么多表单扩展或侦听器,所以我没有给您答案。