2016-03-15 88 views
1

我有一个注册表单,其中包含在用户实体类中验证的字段。验证工作正常,但是我不能返回带有表单错误消息的JsonResponse。JsonResponse中没有显示任何表单错误 - Symfony

我的登记表控制器的方法是这样的:

/** 
    * @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":"Not registered","errors":{}}

其实我在说“错误“:{}将包含一些错误字段,但它不包含。有谁知道这里的问题是什么?

UPD:

我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(); 
} 

回答

2

表,当你调用$form->handleRequest($request);

要获得形式错误使用getErrors方法

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

转换错误反对验证消息阵列可以使用代码从这个回应 - Handle form errors in controller and pass it to twig

这是exapmle我是如何在过程中的错误我的其中一个项目

$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

You must set error_bubbling to true in your form type by explicitly setting the option for each and every field.

+0

这并没有帮助我 – rvaliev

+0

不,同空 “错误”:{}。 新增 的foreach($形式 - > getErrors()作为$错误){$ 错误[] = $误差; } – rvaliev

+0

显示您的RegistrationType代码 – Dmitry

相关问题