Посмотрите на этот пример:
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope,$http) {
var getJoke = function(){
return $http.get('http://api.icndb.com/jokes/random').then(function(res){
return res.data.value;
});
}
getJoke().then(function(res) {
console.log(res.joke);
});
});
Как вы можете видеть, getJoke
возвращает разрешенное обещание (оно разрешено при возврате res.data.value
). Таким образом, вы ждете, пока запрос $ http.get не будет завершен, а затем выполнится console.log (res.joke) (как обычный асинхронный поток).
Это plnkr:
Вам нужно сделать это (на основе предыдущего ответа):
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 возвращает как массив.
Похоже, вы пытаетесь ответить на коллекцию. Для этого вам нужно настроить сериализатор (или получить данные в виде массива).
Посмотрите на страницы этого документа: http://symfony.com/doc/current/components/http_foundation/introduction.html#creating-a-json-response
и
Вам нужно изменить свой код следующим образом:
/**
* @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
Я думаю, что ответ @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() {
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
'SELECT c
FROM AppBundle:Categoria c'
);
$categorias = $query->getArrayResult();
return new Response(json_encode($categorias), 200);
}