Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Return a JSON array from a Controller in Symfony

Tags:

json

php

symfony

I am trying return a JSON response from a controller in Symfony 2. Form example, in Spring MVC I can get a JSON response with @ResponseBody annotattion. I want get a JSON response, no mtter if it is a JSON Array or a Json Object, then, manipulate it with javascript in the view.

I try the next code:

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

But I get [{},{}] as Response in the browser. I try with $response = new Response(json_encode($categorias)); too, but I get the same result.

like image 798
Giancarlo Ventura Granados Avatar asked Jan 25 '15 20:01

Giancarlo Ventura Granados


2 Answers

I think the @darkangelo answer need explainations.

The findAll() method return a collection of objects.

$categorias = $this->getDoctrine()
                   ->getRepository('AppBundle:Categoria')
                   ->findAll();

To build your response, you have to add all getters of your entities to your response like :

$arrayCollection = array();

foreach($categorias as $item) {
     $arrayCollection[] = array(
         'id' => $item->getId(),
         // ... Same for each property you want
     );
}

return new JsonResponse($arrayCollection);

Use QueryBuilder allows you to return results as arrays containing all properties :

$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
    'SELECT c
    FROM AppBundle:Categoria c'
);
$categorias = $query->getArrayResult();

return new JsonResponse($categorias);

The getArrayResult() avoids need of getters.

like image 71
chalasr Avatar answered Sep 27 '22 00:09

chalasr


You need to do this (based on previous answer):

public function getAllCategoryAction() {
    $em = $this->getDoctrine()->getManager();
    $query = $em->createQuery(
        'SELECT c
        FROM AppBundle:Categoria c'
    );
    $categorias = $query->getArrayResult();

    $response = new Response(json_encode($categorias));
    $response->headers->set('Content-Type', 'application/json');

    return $response;
}

It works perfect with any Query that Doctrine returns as array.

like image 26
darkangelo Avatar answered Sep 25 '22 00:09

darkangelo