how to return json encoded form errors in symfony
ajax, forms, json, php, symfony
Solution
I've finally found the solution to this problem here, it only needed a small fix to comply to latest symfony changes and it worked like a charm:
The fix consists in replacing line 33
if (count($child->getIterator()) > 0) {
with
if (count($child->getIterator()) > 0 && ($child instanceof \Symfony\Component\Form\Form)) {
because, with the introduction in symfony of Form\Button, a type mismatch will occur in serialize function which is expecting always an instance of Form\Form.
You can register it as a service:
services:
form_serializer:
class: Wooshii\SiteBundle\FormErrorsSerializer
and then use it as the author suggest:
$errors = $this->get('form_serializer')->serializeFormErrors($form, true, true);
Problem
I want to create a webservice to which I submit a form, and in case of errors, returns a JSON encoded list that tells me which field is wrong. currently I only get a list of error messages but not an html id or a name of the fields with errors here's my current code ``` public function saveAction(Request $request) { $em = $this->getDoctrine()->getManager(); $form = $this->createForm(new TaskType(), new Task()); $form->handleRequest($request); $task = $form->getData(); if ($form->isValid()) { $em->persist($task); $em->flush(); $array = array( 'status' => 201, 'msg' => 'Task Created'); } else { $errors = $form->getErrors(true, true); $errorCollection = array(); foreach($errors as $error){ $errorCollection[] = $error->getMessage(); } $array = array( 'status' => 400, 'errorMsg' => 'Bad Request', 'errorReport' => $errorCollection); // data to return via JSON } $response = new Response( json_encode( $array ) ); $response->headers->set( 'Content-Type', 'application/json' ); return $response; } ``` this will give me a response like ``` { "status":400, "errorMsg":"Bad Request", "errorReport":{ "Task cannot be blank", "Task date needs to be within the month" } } ``` but what I really want is something like ``` { "status":400, "errorMsg":"Bad Request", "errorReport":{ "taskfield" : "Task cannot be blank", "taskdatefield" : "Task date needs to be within the month" } } ``` How can I achieve that?