【问题标题】:No form errors shown in JsonResponse - SymfonyJsonResponse 中没有显示表单错误 - Symfony
【发布时间】:2016-03-15 10:43:45
【问题描述】:

我有一个注册表单,其中包含在用户实体类中验证的字段。验证工作正常,但是我无法返回带有表单错误消息的 JsonResponse。

我的注册表单控制器方法如下所示:

    /**
     * @Route("/register", name="register")
     */
    public function registerAction(Request $request)
    {
        $user = new User();
        $form = $this->createForm(RegistrationType::class, $user);
        $form->handleRequest($request);
        $errors = "";

        if ($form->isSubmitted())
        {
            if ($form->isValid())
            {
                $password = $this->get('security.password_encoder')
                    ->encodePassword($user, $user->getPlainPassword());
                $user->setPassword($password);

                $user->setIsActive(1);
                $user->setLastname('none');

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

                return new JsonResponse(
                    array(
                        'message' => 'Success! User registered!',
                    ), 200);
            }
            else
            {
                $errors = ($this->get('validator')->validate($form));

                return new JsonResponse(
                    array(
                        'message' => 'Not registered',
                        'errors'  => $errors,
                    ), 400);
            }
        }

        return $this->render(
            'ImmoBundle::Security/register.html.twig',
            array('form' => $form->createView(), 'errors' => $errors)
        );
    }

我在提交包含无效数据的注册表单时收到以下 json 响应:

{"message":"未注册","errors":{}}

实际上,我希望 "errors":{} 包含一些错误字段,但事实并非如此。有谁知道这里的问题是什么?

更新:

我的 RegistrationType 如下所示:

class RegistrationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('firstname', TextType::class)
            ->add('email', EmailType::class)
            ->add('plainPassword', RepeatedType::class, array(
                'type' => PasswordType::class,
                'first_options' => array('label' => 'Password'),
                'second_options' => array('label' => 'Repeat password'),
                'invalid_message' => "Passwords don't match!",
            ))
            ->add('register', SubmitType::class, array('label' => 'Register'));
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
                'data_class'        => 'ImmoBundle\Entity\User',
                'csrf_protection'   => true,
                'csrf_field_name'   => '_token',
                'csrf_token_id'     => 'authenticate',
            ));
    }
}

UPD2:找到了解决方案。我需要做这个迭代,然后调用 getMessage():

$allErrors = ($this->get('validator')->validate($form));

foreach ($allErrors as $error)
{
  $errors[] = $error->getMessage();
}

【问题讨论】:

    标签: json symfony


    【解决方案1】:

    当您致电 $form->handleRequest($request); 时验证表单

    要获取表单错误,请使用getErrors 方法

    $errors = $form->getErrors(true); // $errors will be Iterator
    

    要将错误对象转换为消息数组,您可以使用此响应中的代码 - Handle form errors in controller and pass it to twig

    这是我如何在我的一个项目中处理错误的示例

     $response = $this->get('http.response_formatter');
     if (!$form->isValid()) {
         $errors = $form->getErrors(true);
         foreach ($errors as $error) {
             $response->addError($error->getMessage(), Response::HTTP_BAD_REQUEST);
         }
    
         return $response->jsonResponse(Response::HTTP_BAD_REQUEST);
     }
    

    它对我有用。

    这也可以帮助你 - Symfony2 : How to get form validation errors after binding the request to the form

    您必须通过为每个字段显式设置选项,在表单类型中将 error_bubbling 设置为 true。

    【讨论】:

    • 不,同样的空“错误”:{}。添加 foreach ($form->getErrors() as $error) { $errors[] = $error; }
    • 我已将 RegistrationType 添加到我的问题中。
    • 向每个字段添加 'error_bubbling' 在提交时会出现错误:“类型错误:参数 1 传递给 Symfony\Component\Validator\ConstraintViolationList::add() 必须实现接口 Symfony\Component\Validator \ConstraintViolationInterface, 实例 Symfony\Component\Form\FormError given"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多