Forms Symfony-使用表单偶数侦听器设置数据

Forms Symfony-使用表单偶数侦听器设置数据,forms,symfony,Forms,Symfony,我有一张登记表 当表单提交并生效时,会发生一系列验证,比如检查密码和密码是否匹配。 如果没有,我将重定向到带有错误消息的同一页 但我不希望我的用户丢失他已经填写的所有数据。 我如何用这些数据填写表格。我应该使用FormEventListener吗 public function register(Request $request, RegisterHandler $registerHandler, Register $register) { if($this->getUser())

我有一张登记表

当表单提交并生效时,会发生一系列验证,比如检查密码和密码是否匹配。 如果没有,我将重定向到带有错误消息的同一页

但我不希望我的用户丢失他已经填写的所有数据。 我如何用这些数据填写表格。我应该使用FormEventListener吗

public function register(Request $request, RegisterHandler $registerHandler, Register $register)
{
    if($this->getUser()){
        return $this->redirectToRoute('homepage');
    }

    $form = $this->createForm(RegisterType::class, $register);

    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        try{
            $registerHandler->handle($form->getData());
        }catch (UserAlreadyExistException $e){
            $this->addFlash('error', $e->getMessage());
            return $this->redirectToRoute('register');
        }catch (PasswordMatchingException $e){
            $this->addFlash('error', $e->getMessage());
            return $this->redirectToRoute('register');
        }

        return $this->redirectToRoute('homepage');
    }

    return $this->render('app/pages/login/register.html.twig', [
        'form' => $form->createView(),
    ]);
}
我的表格类型

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('firstName', TextType::class, [
            'required' => true,
            'label' => 'Your Name',
            'attr' => [
                'class' => 'form-control',
            ]
        ])
        ->add('lastName', TextType::class, [
            'required' => true,
            'label' => 'Your Last Name',
            'attr' => [
                'class' => 'form-control',
            ]
        ])
        ->add('email', EmailType::class, [
            'required' => true,
            'label' => 'Your Email',
            'attr' => [
                'class' => 'form-control',
            ]
        ])
        ->add('password', PasswordType::class, [
            'required' => true,
            'label' => 'Your password',
            'attr' => [
                'id' => 'password1',
                'class' => 'form-control',
            ]
        ])
        ->add('passwordConfirm', PasswordType::class, [
            'required' => true,
            'label' => 'Confirm password',
            'attr' => [
                'id' => 'password2',
                'class' => 'form-control',
            ]
        ])
    ;

    $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
        $data = $event->getData();
        $form = $event->getForm();

        //@TODO
    });
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => Register::class,
    ]);
}

PasswordMatchingException和UserAlreadyExistException来自哪里


通常您会使用或编写自己的,然后$form->isValid()将为false,表单将使用相同的数据再次呈现并显示错误。对于UserAlreadyExistException,您将使用;对于密码,您应该使用。

PasswordMatchingException和UserAlreadyExistException从何而来


通常您会使用或编写自己的,然后$form->isValid()将为false,表单将使用相同的数据再次呈现并显示错误。对于UserAlreadyExistException,您将使用;对于密码,您应该使用。

由于您已经在/注册表中,因此无需重定向。只需删除“注册”路由的重定向,它就可以工作了。不能同时重定向和保留post数据。不需要表单事件。由于您已在/注册表中,因此无需重定向。只需删除“注册”路由的重定向,它就可以工作了。不能同时重定向和保留post数据。不需要表单事件。