Forms Symfony2,在重定向中保留表单数据

Forms Symfony2,在重定向中保留表单数据,forms,validation,symfony,session-variables,url-redirection,Forms,Validation,Symfony,Session Variables,Url Redirection,如何在重定向期间使用会话检索数据?我收到错误消息:“异常'Symfony\Component\Form\exception\AlreadySubmittedException',消息'You cannot change the data of a submitted Form.” C:\Bitnami\wampstack-5.5.30-0\sym\u prog\proj3\u 27\src\MeetingBundle\Controller\UserController.php /** * Cr

如何在重定向期间使用会话检索数据?我收到错误消息:“异常'Symfony\Component\Form\exception\AlreadySubmittedException',消息'You cannot change the data of a submitted Form.”

C:\Bitnami\wampstack-5.5.30-0\sym\u prog\proj3\u 27\src\MeetingBundle\Controller\UserController.php

/**
 * Creates a new User entity.
 *
 * @Route("/new", name="user_new")
 * @Method({"GET", "POST"})
 */
public function newAction(Request $request)
{
    $user = new User();
    $form = $this->createForm(new UserType(), $user);
    $form->handleRequest($request);
    $session = $this->getRequest()->getSession();

    $form->setData(unserialize($session->get('userFilter')));        

    if ( $form->isSubmitted() && $form->isValid() ) {
        $session->set( 'userFilter', serialize($form->getData()) ); 

            $em = $this->getDoctrine()->getManager();
            $em->persist($user);
            $em->flush();
            return $this->redirectToRoute('user_edit', array('id' => $user->getId()));

    } 
    return $this->render('MeetingBundle::user/new.html.twig', array(
        'user' => $user,
        'form' => $form->createView(),
    ));

} //   public function newAction(Request $request)   
C:\Bitnami\wampstack-5.5.30-0\sym\u prog\proj3\u 27\src\MeetingBundle\EventListener\ExceptionListener.php

<?php
namespace MeetingBundle\EventListener;

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Router;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;

use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;

//every time the Kernel throws the kernel.exception event, the function onKernelException() is called.
/* also must create service :
    meeting.exception_listener:
        class: MeetingBundle\EventListener\ExceptionListener
        arguments: [@templating, @kernel, @router]
        tags:
            - { name: kernel.event_listener, event: kernel.exception, method: onKernelException  }    
 */

class ExceptionListener  
{
    protected $templating;
    protected $kernel;
    protected $router; 

    public function __construct( EngineInterface $templating, $kernel, Router $router)
    {
        $this->templating = $templating;
        $this->kernel = $kernel;
        $this->router = $router;
    }    

     public function onKernelException(GetResponseForExceptionEvent $event)
    {
        $exception = $event->getException();
        $request=$event->getRequest();
        $referer = $event->getRequest()->headers->get('referer');       

        $msg="";


        $excStr=$exception->__toString(); // returns string finally! 
        $bdup=strpos( $excStr , 'Integrity constraint violation: 1062 Duplicate entry' );

        if($bdup) { 
            $msg=" This username is already taken. Choose another username. ";           
        }

        if(strlen($msg)!=0) {
            // flash messsages are displayed in layout.html
            $request->getSession()
            ->getFlashBag()
            ->add('Error', $msg);
        }

        $response = new RedirectResponse($referer); // redirect to the error page

        if ($exception instanceof HttpExceptionInterface) {
            $response->setStatusCode($exception->getStatusCode());
            $response->headers->replace($exception->getHeaders());
        } else {
            $response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR);
        }

        $event->setResponse($response);

    }   

}

首先调用
handleRequest()
,它将提交表单,以防表单可以从传递的请求中“派生”。在此之后,调用
setData()
,如果以前提交过表单,则此操作不起作用。您到底想要实现什么?在调用HandlerRequest之前调用setData。尽管你试图做的似乎没有多大意义。