簡體   English   中英

使用rest api提交表單時,驗證正在跳過

[英]Validation is skipping when submit the form with rest api

我有這個表格:

    class RegistrationFormType extends AbstractType
    {
    /**
     * @param FormBuilderInterface $builder
     * @param array                $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('email', EmailType::class, [
                'constraints' => [
                    new NotBlank(),
                ]
            ])
            ->add('username')
            ->add('password')
        ;
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'app_user_register';
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => User::class,
            'allow_extra_fields' => true,
            'csrf_protection' => false,
        ]);
    }
}

在控制器中的api

/**
 * @Route("/api/register")
 * @Method("POST")
 * @param Request $request
 *
 * @return JsonResponse
 */
public function register(
    UserService $userService,
    Request $request
)
{
    try {
         return $userService->register(json_decode($request->getContent(), true));
    } catch (\Exception $e) {
        return $this->json([
            'status' => Response::HTTP_INTERNAL_SERVER_ERROR,
            'result' => $e->getMessage()
        ]);
    }
}

而我的服務職能

public function register($formData)
{
    $user = new User();

    $form = $this->formFactory->create(RegistrationFormType::class, $user);
    $form->submit($formData);

    if ($form->isSubmitted() && $form->isValid()) {
        $this->entityManager->persist($user);
        $this->entityManager->flush();

        return new JsonResponse([
            'status' => Response::HTTP_OK,
            'result' => true
        ]);
    }

    return new JsonResponse([
        'status'    => Response::HTTP_BAD_REQUEST,
        'result'    => FormErrorFormatter::getErrorsFromForm($form)
    ]);
}

當我嘗試使用以下命令在郵遞員中調用api / api / register時

{
    "username": "test1",
    "email": "test1",
    "password": "123456"
}

我得到200 code ,但是通常會丟棄一個錯誤,因為該電子郵件無效,因為我在表單創建中輸入了字段電子郵件應為電子郵件格式,即使我在電子郵件中輸入了空字符串也得到了200 code 因此,似乎驗證無效。

據我所知, EmailType沒有默認約束。 但是,您可以通過要求它是NotBlank來覆蓋約束,該約束絕對不同於Email約束。 表單確實將type="email"添加到html, 瀏覽器將強制執行該html(從技術上講,這是不可靠的,因為用戶可以將其轉換為文本字段)。

解決方案可能是使用Email約束並將required屬性設置為true

嘗試:

       ->add('email', EmailType::class, [
            'constraints' => [
                new NotBlank(),
                new Email(),
            ]
        ])

並添加到您的實體:

 /**
 * @Assert\Email(
 *     message = "The email '{{ value }}' is not a valid email.",
 *     checkMX = true
 * )
 */
protected $email;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM