rvaliev
rvaliev

Reputation: 1081

No form errors shown in JsonResponse - Symfony

I have a registration form with fields that are validated in User entity class. The validation works fine, however I can't return JsonResponse with form error messages in it.

My registration form controller method looks like this:

    /**
     * @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)
        );
    }

I get the following json response when I submit the registration form with invalid data:

{"message":"Not registered","errors":{}}

Actually I'm expecting that "errors":{} will contain some error fields, but it doesn't. Does anyone know what the problem here is?

UPD:

My RegistrationType looks like this:

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: Found the solution. I needed to do this iteration and then call for getMessage():

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

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

Upvotes: 1

Views: 2146

Answers (1)

Dmytro
Dmytro

Reputation: 582

Form validated when you call $form->handleRequest($request);

To get form errors use getErrors method

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

to convert errors object to messages array you can use code from this response - Handle form errors in controller and pass it to twig

This is exapmle how i'm process errors in one of my projects

 $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);
 }

It's worked for me.

And also this can help you - 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.

Upvotes: 2

Related Questions