使用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

        ]);

    }


当我尝试在邮递员中调用 api /api/register 时


{

    "username": "test1",

    "email": "test1",

    "password": "123456"

}

我得到200 code,但通常应该删除错误,因为电子邮件无效,因为我在表单创建中设置了字段电子邮件应该采用电子邮件格式,即使我在电子邮件中放入一个空字符串,我也会得到200 code. 所以似乎验证不起作用。


一只甜甜圈
浏览 149回答 2
2回答

慕森王

EmailType,据我所知,没有默认约束。但是,您通过要求它来覆盖约束,NotBlank这绝对与Email约束不同。表单确实添加type="email"到浏览器将强制执行的 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;
打开App,查看更多内容
随时随地看视频慕课网APP