FOSRestBundle et JMS Sérialiseur, erreur lors de geting JSON
J'ai essayé de Symfony 2.2, le FOSRest Bundle (à l'aide de JMS Sérialiseur), et la Doctrine de l'ODM à l'aide de MongoDB.
Après de nombreuses heures à essayer de comprendre comment correctement le programme d'installation de la FOSRest Bundle j'ai encore quelques soucis: j'ai un parcours très simple qui retourne une liste de produits et de prix. Chaque fois que je demande pour le format HTML-je obtenir la bonne réponse, mais si je demande à un autre format (JSON, XML), j'obtiens une erreur:
[{"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",...
vous pouvez voir l'intégralité message d'erreur ici
Mon installation actuelle est très simple: j'ai créé un itinéraire unique à un contrôleur qui retourne une liste de produits et le prix (j'ai suivi cet exemple pour créer le produit le document).
C'est la route:
rest_product:
type: rest
resource: Onema\RestApiBundle\Controller\ProductController
C'est le contrôleur:
<?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);
}
}
C'est la vue à partir du contrôleur de Ressources/Produits/obtenir.html.rameau:
<ul>
{% for document in documents %}
<li>
{{ document.name }}<br />
{{ document.price }}
</li>
{% endfor %}
</ul>
Des idées pourquoi cela devrait fonctionner correctement pour un format, mais pas les autres? Rien d'autre, je suis censé l'installation?
Mise à JOUR:
C'est la config des valeurs que j'ai été à l'aide.
À la fin de l'app/config/config.yml, j'ai eu ceci:
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'
Solution de CONTOURNEMENT:
Faire un peu plus de recherche, j'ai couru dans une autre erreur qui me conduisent à cette question et la réponse:
https://stackoverflow.com/a/14030646/155248
Une fois je me suis débarrassé de la Doctrine\ODM\MongoDB\LoggableCursor
par l'ajout de chaque résultat à un tableau comme ceci:
$productsQ = $dm->getRepository('RestApiBundle:Product')->findAll();
foreach ($productsQ as $product) {
$products[] = $product;
}
return $products;
J'ai commencé à obtenir des résultats dans le format correct. C'est le genre de boiteux solution et toujours l'espoir de trouver une meilleure réponse à cette question.
find*
méthodes retournent un Cursor
. Vous pouvez appeler toArray
sur un Cursor
.OriginalL'auteur Onema | 2013-04-23
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez obtenir une colection de RestApiBundle:Produit des documents, vous DEVEZ appeler la méthode "toArray" après l'appel de la méthode find de dépôt ou getQuery méthode de générateur de requêtes
vous pouvez également appeler array_values($produits) pour corriger la sérialisation d'exclure de la stratégie
OriginalL'auteur BattleBit
Plus probable que l'erreur se situe quelque part dans vos fichiers de configuration ou peut-être manque-t-il? Ajoutez vos configs et si je peux je mettrai à jour ma réponse.
Pour l'instant, je vais vous guider à travers une mise en œuvre simple.
D'abord, permet de commencer avec les configs:
Note: je vais être en utilisant des annotations pour certains des paramètres de voir SensioFrameworkExtraBundle.
Nous avons d'abord le programme d'installation sensio extra-bundle. Le configuration par défaut permet les annotations sont vrai. J'ai désactivé les annotations pour la vue(je n'utiliserai pas ici).
Pour fos_rest nous mettons en place des Les auditeurs, nous allons garder les choses simples de sorte que nous allons utiliser l'exemple de leurs docs.
Nous allons créer l'entité:
Vous remarquerez un couple de paramètres d'annotation. Nous avons d'abord défini @ExclusionPolicy("tous"), puis nous nous définir manuellement l'objet sur lequel nous voulons @Exposer à l'API. Vous pouvez en savoir plus sur cette ici et une liste de JMS Sérialiseur annotations
Maintenant passons à un contrôleur simple:
C'est un simple contrôleur sera de retour tout.
J'espère que cela a aidé. Je pense que ton erreur vient d'une mauvaise configuration liées à la Sérialiseur. Assurez-vous que votre exposer certaines données.
En fait, je prends le commentaire du format HTML ne fonctionne pas... j'ai raté l'annotation @Rest\View() dans le contrôleur 😛 tout le reste est le même.
OriginalL'auteur Kirill Fuchs