我一直在試用Symfony 2.2,FOSRest Bundle(使用JMS串行器)和Doctrine ODM使用MongoDB。FOSRestBundle和JMS串行器,在創建JSON時出錯
經過很多小時的試圖弄清楚如何正確設置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",...
,你可以看到完整的錯誤信息here
我目前的設置非常簡單:我創建了一條返回控制器的路線,返回產品列表和價格(我遵循this example來創建產品文檔)。
這是路線:
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);
}
}
這是從控制器資源/產品/ get.html.twig稱爲視圖:
<ul>
{% for document in documents %}
<li>
{{ document.name }}<br />
{{ document.price }}
</li>
{% endfor %}
</ul>
任何想法,爲什麼這將工作正確的一種格式,但不是其他人?還有什麼額外的我應該設置?
更新: 這是我一直在使用的配置值。 在應用程序/配置/ 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;
我開始以正確的格式獲得結果。這是一種蹩腳的解決方案,但仍希望能找到更好的解決方案。
無需循環。 Doctrine ODM'find *'方法返回一個'Cursor'。你可以在'Cursor'上調用'toArray'。 – Entea 2013-06-27 05:29:25