Вернуть массив JSON из контроллера в Symfony

Я пытаюсь вернуть ответ JSON от контроллера в Symfony 2. Пример формы, в Spring MVC, я могу получить ответ JSON с annotattion @ResponseBody. Я хочу получить ответ JSON, без mtter, если это JSON Array или Json Object, а затем манипулировать им с помощью javascript в представлении.

Я пробую следующий код:

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

Но я получаю [{},{}] качестве ответа в браузере. Я пытаюсь с $response = new Response(json_encode($categorias)); тоже, но я получаю тот же результат.

Вам нужно сделать это (на основе предыдущего ответа):

 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; } 

Он отлично работает с любым запросом, который Doctrine возвращает как массив.

Я думаю, что ответ @darkangelo требует объяснений.

Метод findAll() возвращает коллекцию объектов.

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

Чтобы создать свой ответ, вы должны добавить все получатели ваших сущностей в свой ответ, например:

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

Использование QueryBuilder позволяет возвращать результаты в виде массивов, содержащих все свойства:

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

getArrayResult() избегает использования геттеров.

Вы должны изменить свой код таким образом:

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

Если служба serializer не включена, вы должны включить ее в app/config/config.yml :

  framework: # ... serializer: enabled: true 

Для более сложных опций для сериализации вы можете установить JMSSerializerBundle

Похоже, вы пытаетесь ответить на коллекцию. Для этого вам нужно настроить сериализатор (или получить данные в виде массива).

Посмотрите на страницы этого документа: http://symfony.com/doc/current/components/http_foundation/introduction.html#creating-a-json-response

а также

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

Я предлагаю следующее решение:

 /** * @Route( * "/drop/getCategory/", * name="getCategory" * ) * @Method("GET") */ public function getAllCategoryAction() { $em = $this->getDoctrine()->getManager(); $query = $em->createQuery( 'SELECT c FROM AppBundle:Categoria c' ); $categorias = $query->getArrayResult(); return new Response(json_encode($categorias), 200); }