2015-01-25 2 views
9

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

Я стараюсь следующий код:

/** 
    * @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));, но я получаю тот же результат.

+0

Вы пытались вернуть новый JSONResponse ($ data); '? – Neal

ответ

7

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

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 как массив.

+8

Вы можете улучшить свой ответ, используя 'JsonResponse' вместо' Response'. Это позволит избежать дублирования использования 'json_encode' и пользовательских заголовков. – chalasr

1

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

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

+0

Я получаю ошибку 500: вы запросили несуществующий сервис «serializer». –

+0

Вы должны сначала включить услугу сериализатора. В app/config/config.yml добавьте это: 'framework: # ... serializer: enabled: true' –

+0

Я получаю решение: $ categorias = $ query-> getArrayResult(); \t \t // $ response-> headers-> set ('Content-Type', 'application/json'); \t \t // return $ response; \t \t // возвращаем $ this-> render ('AppBundle: Front: test.html.twig', array ('otra' => $ otra)); \t \t return new Response (json_encode ($ categorias), 200); –

0

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

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

Возможно, вы должны использовать newJsonResponse, как в своем вопросе. – Cerad

1

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

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

и

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

11

Я думаю, что ответ @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() избегает использования геттеров.

Смежные вопросы