Return a JSON array from a Controller in Symfony

后端 未结 7 945
一个人的身影
一个人的身影 2020-12-17 14:30

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 re

相关标签:
7条回答
  • 2020-12-17 14:40

    You need to change your code this way:

    /**
     * @Route(
     *      "/drop/getCategory/",
     *      name="getCategory"
     * )
     * @Method("GET")
     */
    public function getAllCategoryAction() {
        $categorias = $this->getDoctrine()
                           ->getRepository('AppBundle:Categoria')
                           ->findAll();
    
        $categorias = $this->get('serializer')->serialize($categorias, 'json');
    
        $response = new Response($categorias);
    
        $response->headers->set('Content-Type', 'application/json');
        return $response;
    }
    

    If the serializer service is not enabled, you have to enable it in app/config/config.yml:

        framework:
            # ...
            serializer:
                enabled: true
    

    For more advanced options for serialization, you can install JMSSerializerBundle

    0 讨论(0)
  • 2020-12-17 14:40

    Looks like you are trying to put into response a collection. For that you need to setup serializer (or retrieve data as an array).

    Look at this doc pages: http://symfony.com/doc/current/components/http_foundation/introduction.html#creating-a-json-response

    and

    http://symfony.com/doc/current/cookbook/serializer.html.

    0 讨论(0)
  • 2020-12-17 14:44
    /**
     * @Route("/api/list", name="list")
     */
    public function getList(SerializerInterface $serializer, SomeRepository $repo): JsonResponse
    {
        $models = $repo->findAll();
        $data = $serializer->serialize($models, JsonEncoder::FORMAT);
        return new JsonResponse($data, Response::HTTP_OK, [], true);
    }
    
    0 讨论(0)
  • 2020-12-17 14:49

    Following the best practices, I managed to do it the following way:

    public function index(CityRepository $cityRepository,
                          SerializerInterface $serializer): Response 
    

    Injecting repository & serializer.

    $cities = $cityRepository->findAll();
    

    Retrieving an array of objects.

    $data = $serializer->serialize($cities, 'json');
    

    Serializing the data into a JSON string.

    return new JsonResponse($data, 200, [], true);
    

    Passing the JSON string to JsonResponse.

    0 讨论(0)
  • 2020-12-17 14:55

    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.

    0 讨论(0)
  • 2020-12-17 15:01

    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.

    0 讨论(0)
提交回复
热议问题