首页 > 解决方案 > Symfony5 表单未提交,尽管变量在 POST 属性中

问题描述

我正在为 Symfony5 制作一个简单的结帐表单,并希望创建一个用户。我的路由器中有以下代码:

/**
 * @Route("/register", name="app_register", methods={"POST","GET"})
 * @param Request $request
 * @param UserPasswordEncoderInterface $passwordEncoder
 * @param GuardAuthenticatorHandler $guardHandler
 * @param TokenAuthenticator $authenticator
 * @param AuthenticationUtils $authenticationUtils
 * @return Response
 */
public function register(
    Request $request,
    UserPasswordEncoderInterface $passwordEncoder,
    GuardAuthenticatorHandler $guardHandler,
    TokenAuthenticator $authenticator,
    AuthenticationUtils $authenticationUtils
): Response {
    $user = new Customer();
    $customerAddress = new CustomerAddress();
    $user->addCustomerAddress($customerAddress);
    $form = $this->createForm(RegistrationFormType::class, $user, [
        'action' => $this->generateUrl('app_register'),
        'method' => Request::METHOD_POST
    ]);

    $error = $authenticationUtils->getLastAuthenticationError();

    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        // encode the plain password
        $user->setPassword(
            $passwordEncoder->encodePassword(
                $user,
                $form->get('plainPassword')->getData()
            )
        );

        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($user);
        $entityManager->flush();

        // do anything else you need here, like send an email

        return $guardHandler->authenticateUserAndHandleSuccess(
            $user,
            $request,
            $authenticator,
            'main' // firewall name in security.yaml
        );
    }

    return $this->render('registration/register.html.twig', [
        'userForm' => $form->createView(),
        'error' => $error
    ]);
}

但是每次我提交表单时,它都不会进入if. 但是我可以转储$_POST并查看变量(但在 assoc 数组中,而不是在 $_POST 中直接作为 Key => Value 对。此外,$request不包含 POST 变量,除非我手动调用$request::createFromGlobals()。但仍然在这种情况下表单没有得到验证。我认为它与表单的命名有关。我怎样才能让这个表单工作?

标签: phpsymfony5

解决方案


我正在与您分享我自己测试过的示例代码,以确保您的表单工作正常并且 data_class 已在您的表单中设置。还要检查 $form->isSubmitted() 和 $form->isValid() 的响应是什么,并尝试查看表单验证错误它将帮助您快速检测问题。

// Get Form errors 
$form->getErrors(true);

控制器 :

/**
 * @param Request $request
 * @return Response
 */
public function __invoke(Request $request): Response
{

    $form = $this->createForm(Registration::class);
    $form->handleRequest($request);

    if ($request->isMethod('POST')) {
        if ($form->isSubmitted() && $form->isValid()) {
            /**
             * @var $formData User
             */
            $formData = $form->getData();

            $formData->setPassword($this->passwordEncoder->encodePassword($formData, $formData->getPassword()));
            $this->entityManager->persist($formData);
            $this->entityManager->flush();

            // TODO Redirect to success page
            $this->redirectToRoute('register_success');
        } else {
            $form = $form->createView();
        }
    } else {
        // Creating Registration form
        $form = $this
            ->createForm(Registration::class)
            ->createView();
    }

    return $this->render('pages/register.html.twig', ['form' => $form]);
}

从类:

  class Registration extends AbstractType {
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder->add('firstName', TextType::class, [
            'required' => true,
        ])->add('lastName', TextType::class, [
            'required' => true,
        ])->add('email', EmailType::class, [
            'required' => true,
        ])->add('password', RepeatedType::class, [
            'type' => PasswordType::class,
            'first_options' => [
                'label' => 'Password'
            ],
            'second_options' => [
                'label' => 'Repeat Password'
            ]
        ]);
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'data_class' => User::class,
            'error_bubbling' => false
        ]);
    }

}

推荐阅读