如何验证(服务器端)从 Vue 创建和提交的表单?
我有一个简单的联系表单,我想在客户端和服务器端验证它。对于客户端模式,我使用 vee-validate (并且有效),对于服务器端模式我想使用 Symfony 的表单验证。
所以在这种“特殊”情况下,表单不是使用 Symfony 的方法呈现的,这种情况下的表单仅用于验证。我已经创建了表单(它没有链接到实体对象),但是当我发送 http post
时来 self 的 Vue 组件的请求,服务器端的验证不起作用。似乎没有“读取”在 FormType
中创建的约束类。
我的职能:
public function sendContactUsEmailAction(Request $request, Mailer $mailer, TranslatorInterface $translator)
{
try {
$form = $this->createForm(ContactUsType::class);
$form->submit($request->request->all());
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$emailParams = new ContactUsParams();
$emailParams->setName($data['name']);
$emailParams->setEmail($data['email']);
$emailParams->setSubject($data['subject']);
$emailParams->setMessage($data['message']);
$email = new ContactUsMail($mailer, $emailParams);
$email->send();
return new JsonResponse($translator->trans('send_contact_us_email_response'));
}
return new JsonResponse($this->getFirstFormError($form), 400);
} catch (\Exception $e) {
return new JsonResponse($e->getMessage(), 500);
}
}
已编辑
这是我的请求数据的转储:
array:4 [
"name" => "Example"
"email" => "foo@example.com"
"subject" => "Test subject"
"message" => "Test message"
]
这是我的 FormType 类。为了测试它,我为名称属性添加了约束“电子邮件”,但从请求中我没有发送有效的电子邮件。
class ContactUsType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class, array(
'constraints' => array(
new NotBlank(),
new Email(),
),
))
->add('email', EmailType::class, array(
'constraints' => array(
new NotBlank(),
new Email(),
),
))
->add('subject', TextType::class, array(
'constraints' => new NotBlank(),
))
->add('message', TextareaType::class, array(
'constraints' => new NotBlank(),
));
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'csrf_protection' => false,
'validation_groups' => false,
]);
}
}
最佳答案
我找到了解决方案。问题是由选项“validation_groups”设置为 false 引起的。我将其删除,现在可以使用了!
关于php - Symfony 4 - 验证从 Vue 发送的表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51916159/