php - 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()
。但仍然在这种情况下表单没有得到验证。我认为它与表单的命名有关。我怎样才能让这个表单工作?
解决方案
我正在与您分享我自己测试过的示例代码,以确保您的表单工作正常并且 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
]);
}
}
推荐阅读
- bash - 我需要帮助以 shell 脚本中的奇数行分隔我的 .dat 文件
- airflow - Airflow 为每个 DAG 添加一个 UI 按钮
- c# - 如何在 Word 应用程序中将突出显示 ColorIndex 属性重置为不突出显示
- bash - Ubuntu Preseed 和模板
- python - 为什么 plt.show() 不能在屏幕上显示图片
- javascript - 如何正确编码 PHP 中的 JavaScript 以附加到页面?
- javascript - 因缺乏迭代而注销,express js,node js,passport js
- reactjs - Typescript reactjs无法将道具传播到输入标签
- javascript - 如何在控制台中为 doc 文件设置原始谷歌附加组件
- php - 通知 php 脚本