2012-09-13 13 views
48

Digamos que quiero crear un XML-respuesta que se ve algo como lo siguiente:¿Cómo crear un buen formato hipermedia utilizando JMSSerializerBundle?

<?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> 

Dado un modelo de dominio que se ve algo como lo siguiente:

<?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; 

    [..] 
} 

Y una clase de dinero a lo largo de las líneas de:

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

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

Ahora, a mis preguntas. Sería bastante simple para crear una respuesta que se parece a la siguiente

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

utilizando anotaciones, XML o YAML para contar JMSSerializerBundle cómo serializar el objeto-producto. Sin embargo, la entidad no debe especificar las entradas xmlns:atom y <atom:link>, ya que no debe tener el concepto de cómo y donde está ubicado. También podría imaginar más enlaces con diferentes rel -attributes, como edit.
Una solución que viene a la mente sería un servicio que escucha eventos de serialización para objetos específicos y agrega estos atributos y etiquetas según corresponda. El servicio podría usar DI para obtener el Request, Router -service etc. para generar estos enlaces en un formato que sea adecuado para el formato solicitado. IE en un XML-respuesta, se podría establecer el tipo apropiado de application/media-format+xml, mientras que en un JSON-respuesta, se podría generar algo así como

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

Ahora, en the documentation for JMSSerializerBundle, encuentro anotaciones para @PreSerialize y @PostSerialize, pero parece que solo pueden invocar métodos en el objeto que se serializa.
¿Alguien sabe cómo y si esto se puede lograr? ¿O tengo que usar un motor de plantillas como Twig y crear manualmente la respuesta XML?

+0

Pregunta muy interesante. Después de hurgar un poco, creo que no hay otra solución que contaminar tu entidad con atributos adicionales utilizados solo para la serialización ... Lo que parece faltar en el paquete es la posibilidad de manejar la serialización completa de un objeto en particular con otro clase. – room13

+0

[Aquí puede comprobar 1: indicar el grupo-por-atributo] [1] [También en este caso 2: JMS serializador paquete-complejo-valor generado] [2] [ 1]: http://stackoverflow.com/questions/13665369/jmsserializerbundle-specify-group-per-attribute [2]: http://stackoverflow.com/questions/14475171/jmsserializerbundle-complex-generated-value –

Respuesta

3

El paquete de serializador solo puede no ser suficiente para esta situación, ya que solo se trata de serialización y deserialización, tareas semánticas no más complejas.

Sugeriría buscar en FSCHateoasBundle para implementar un formato bastante hipermedia para su API.

Cuestiones relacionadas