Hola, estoy tratando de obtener una respuesta JSON desde un controlador. Lo hago así:
/** * @Route("/drop/getCategory/", name="getCategory") * @Method("GET") */ public function getAllCategoryAction() { $categorias = $this->getDoctrine() ->getRepository('AppBundle:Categoria') ->findAll(); $response = new JsonResponse(); $response->setData($categorias); $response->headers->set('Content-Type', 'application/json'); return $response; }
Pero obtengo como respuesta:
[{},{}]
Y categorías, por supuesto, tiene contenido en base de datos. La he renderizado en una plantilla y funciona normal.
¿Cómo podría retornar el resultado de una consulta en forma de JSON? No me importa si es en forma de Array o Objeto, solo quisiera obtenerla para manipularla después en vista. Claro que puedo construir el JSON a mano y retornarlo como un string y luego parsearlo en vista, pero quizá se pueda desde el controlador. Gracias a todos por su tiempo.
Respuestas
Lo primero que puedes hacer es simplificar la lógica de tu controlador, ya que la respuesta de tipo JsonResponse
ya se encarga de poner bien las cabeceras JSON y de añadir los datos:
/** * @Route("/drop/getCategory/", name="getCategory") * @Method("GET") */ public function getAllCategoryAction() { $categorias = $this->getDoctrine() ->getRepository('AppBundle:Categoria') ->findAll(); return new JsonResponse($categorias); }
El problema es que la consulta findAll()
devuelve una colección de objetos Doctrine y eso no lo puedes pasar directamente a JsonResponse
. La solución "profesional pero más larga" consiste en serializar el resultado de la consulta de Doctrine antes de devolverlo.
La solución más rápida que debería funcionar bien consiste en decirle a Doctrine que devuelva los resultados como un array de arrays. Eso se hace configurando las opciones de "hidratación" de Doctrine:
/** * @Route("/drop/getCategory/", name="getCategory") * @Method("GET") */ public function getAllCategoryAction() { $categorias = $this->getDoctrine() ->getRepository('AppBundle:Categoria') ->createQueryBuilder('c') ->select('c') ->getQuery() ->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY) ; return new JsonResponse($categorias); }
@javiereguiluz
- Tambien existe el
->getArrayResult()
que es un atajo de->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY)
- )
@manuel_j555
Si, muchas gracias ambos, problema resuelto, no se que haría sin ustedes :)
@SakyaStelios