Я пробовал Symfony 2.2, пакет FOSRest (с использованием JMS Serializer) и Doctrine ODM с использованием MongoDB.
После многих часов попыток выяснить, как правильно настроить пакет FOSRest, у меня все еще есть некоторые проблемы: у меня есть очень простой маршрут, который возвращает список продуктов и цен. Всякий раз, когда я запрашиваю формат HTML, я получаю правильный ответ, но если я запрашиваю любой другой формат (JSON, XML), я получаю сообщение об ошибке:
[{"message": "Resources are not supported in serialized data. Path: Monolog\\Handler\\StreamHandler -> Symfony\\Bridge\\Monolog\\Logger -> Doctrine\\Bundle\\MongoDBBundle\\Logger\\Logger -> Doctrine\\Bundle\\MongoDBBundle\\Logger\\AggregateLogger -> Doctrine\\ODM\\MongoDB\\Configuration -> Doctrine\\MongoDB\\Connection -> Doctrine\\ODM\\MongoDB\\LoggableCursor",
"class": "JMS\\Serializer\\Exception\\RuntimeException",...
вы можете увидеть полное сообщение об ошибке здесь
Моя текущая настройка очень проста: я создал единственный маршрут к контроллеру, который возвращает список продуктов и цену (я следовал этот пример для создания документа о продукте).
Это маршрут:
rest_product:
type: rest
resource: Onema\RestApiBundle\Controller\ProductController
Это контроллер:
<?php
namespace Onema\RestApiBundle\Controller;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use FOS\RestBundle\Controller\FOSRestController;
use FOS\RestBundle\Routing\ClassResourceInterface;
use FOS\Rest\Util\Codes;
use JMS\Serializer\SerializationContext;
use Onema\RestApiBundle\Document\Product;
class ProductController extends FOSRestController implements ClassResourceInterface
{
public function getAction()
{
$dm = $this->get('doctrine_mongodb')->getManager();
$products = $dm->getRepository('RestApiBundle:Product')->findAll();
if(!$products)
{
throw $this->createNotFoundException('No product found.');
}
$data = array('documents' => $products);
$view = $this->view($data, 200);
$view->setTemplate("RestApiBundle:Product:get.html.twig");
return $this->handleView($view);
}
}
Это представление вызывается из контроллера Resources/Product/get.html.twig:
<ul>
{% for document in documents %}
<li>
{{ document.name }}<br />
{{ document.price }}
</li>
{% endfor %}
</ul>
Есть идеи, почему это будет работать правильно для одного формата, но не для других? Что-то еще нужно настроить?
ОБНОВЛЕНИЕ: это значения конфигурации, которые я использовал. В конце app/config/config.yml у меня было это:
sensio_framework_extra:
view: { annotations: false }
router: { annotations: true }
fos_rest:
param_fetcher_listener: true
body_listener: true
format_listener: true
view:
formats:
json: true
failed_validation: HTTP_BAD_REQUEST
default_engine: twig
view_response_listener: 'force'
ВРЕМЕННОЕ РЕШЕНИЕ:
Проведя немного больше исследований, я столкнулся с другой ошибкой, которая привела меня к этим вопросам и ответам:
https://stackoverflow.com/a/14030646/155248
Однажды я избавился от Doctrine\ODM\MongoDB\LoggableCursor
, добавив каждый результат в такой массив:
$productsQ = $dm->getRepository('RestApiBundle:Product')->findAll();
foreach ($productsQ as $product) {
$products[] = $product;
}
return $products;
Я начал получать результаты в правильном формате. Это своего рода хромое решение, и я все еще надеюсь найти лучший ответ на этот вопрос.
find*
возвращаютCursor
. Вы можете позвонитьtoArray
по номеруCursor
. - person Entea   schedule 27.06.2013