Я пытаюсь вернуть ответ 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
а также
Я предлагаю следующее решение:
/** * @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); }