48 votes

Comment créer un bon format hypermédia avec JMSSerializerBundle?

Disons que je veux créer un XML-réponse qui ressemble à quelque chose comme:

<?xml version="1.0" encoding="utf‐8"?>
<product xmlns="urn:com.acme.prods" xmlns:atom="http://www.w3.org/2005/xlink">
  <id>1234</id>
  <name>Red Stapler</name>
  <price currency="EUR">3.14</price>
  <atom:link rel="payment" type="application/com.acme.shop+xml"
             href="http://acme.com/products/1234/payment" />
</product>

Étant donné un modèle de domaine qui ressemble à quelque chose comme ce qui suit:

<?php
// Product.php
namespace Acme\Bundle\ProductBundle\Entity;
use Acme\Bundle\ProductBundle\Money\Money;

class Product
{
  /**
   * @var integer
   */
  private $id;

  /**
   * @var string
   */
  private $name;

  /**
   * @var Money
   */
  private $price;

  [..]
}

Et l'argent de la classe, le long des lignes de:

<?php
// Money.php
namespace Acme\Bundle\ProductBundle\Money;

class Money
{
  /**
   * @var string
   */
  private $currency;
  /**
   *
   */
  private $amount;
}

Maintenant, à mes questions. Il serait assez simple de créer une réponse qui ressemble à la suivante

<?xml version="1.0" encoding="utf‐8"?>
<product>
  <id>1234</id>
  <name>Red Stapler</name>
  <price currency="EUR">3.14</price>
</product>

soit en utilisant les annotations, XML ou YAML pour dire JMSSerializerBundle comment sérialiser le Produit-objet. Cependant, l' xmlns:atom et <atom:link> des entrées ne doit pas être spécifiée par l'entité, puisqu'il devrait n'en ont aucune idée de comment et il est situé. Vous pouvez aussi imaginer plus de liens avec différents rel-attributs, tels que l' edit.
Une solution qui vient à l'esprit serait un service à l'écoute de la sérialisation des événements pour des objets spécifiques, et ajoute ces attributs et balises appropriées. Le service pourrait utiliser DI pour se procurer de l' Request, Router-service, etc pour générer ces liens dans un format approprié pour le format demandé. I. E en XML-réponse, on pourrait définir le type approprié d' application/media-format+xml, alors que, dans une réponse json, il pourrait générer quelque chose comme

"links": [
   {
     "rel": "payment", 
     "type": "application/media-format+json", 
     "href": "[...]"
   }
]

Maintenant, dans la documentation de JMSSerializerBundle, je trouve les annotations pour l' @PreSerialize, et @PostSerialize, mais ils semblent seulement être en mesure d'appeler des méthodes sur l'objet sérialisé.
Personne ne sait comment/si cela peut être réalisé? Ou dois-je utiliser un moteur de template comme des Rameaux et de créer manuellement le XML de la réponse?

3voto

Lars Strojny Points 522

Le paquet de sérialiseur seul pourrait ne pas suffire à cette situation car il ne concerne que la sérialisation et la désérialisation, pas des tâches sémantiques plus complexes.

Je suggérerais de regarder dans FSCHateoasBundle pour implémenter un joli format hypermédia pour votre API.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X