Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Obtener un array u objeto JSON desde un controlador en Symfony

25 de enero de 2015

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

#1

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

25 enero 2015, 23:00
#2
Tambien existe el ->getArrayResult() que es un atajo de ->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY)
)

@manuel_j555

26 enero 2015, 0:37
#3

Si, muchas gracias ambos, problema resuelto, no se que haría sin ustedes :)

@SakyaStelios

26 enero 2015, 1:22