2012-09-13 13 views
48

Lets sagen, dass ich eine XML-Antwort erstellt werden soll, dass wird so etwas wie folgt aussieht:Wie erstellt man ein gutes Hypermedia-Format mit 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> 

eine Domain-Modell gegeben, die etwa wie folgt aussieht:

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

    [..] 
} 

und eine Geld-Klasse im Sinne von:

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

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

Nun zu meinen Fragen. Es wäre ziemlich einfach sein, um eine Antwort zu erstellen, die

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

entweder mit Anmerkungen, XML oder YAML wie folgt aussieht JMSSerializerBundle zu sagen, wie das Produkt-Objekt serialisiert werden. Allerdings sollten die xmlns:atom und <atom:link> Einträge nicht vom Unternehmen angegeben werden, da es kein Konzept von wie und wo sollte es sich befindet. Sie können sich auch weitere Links mit verschiedenen rel -attributen vorstellen, wie zum Beispiel edit.
Eine Lösung, die den Sinn kommt, wäre ein Dienst sein, der für bestimmte Objekte zu Serialisierung Ereignisse lauscht, und fügt diese Attribute und Tags als angemessen. Der Dienst konnte DI verwenden halten, die Request zu bekommen, Router -Dienst etc diese Links in einem Format zu erzeugen, die für das gewünschte Format geeignet ist. IE in einer XML-Antwort, könnte es die geeignete Art zu application/media-format+xml, während in einer json-Antwort gesetzt, es so etwas wie

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

Jetzt finde ich in the documentation for JMSSerializerBundle, erzeugen könnte Anmerkungen für @PreSerialize und @PostSerialize, aber sie scheinen nur Methoden auf dem zu serialisierenden Objekt aufrufen zu können.
Weiß jemand wie/wenn das erreicht werden kann? Oder muss ich eine Templating-Engine wie Twig verwenden und manuell die XML-Antwort erstellen?

+0

Sehr interessante Frage. Nach stochern ein bisschen, ist ich, was es gibt keine andere Lösung Ihre Unternehmen dann mit zusätzlichen Attributen nur für die Serialisierung verschmutzt ... Was im Bündel zu fehlen scheint, ist eine Möglichkeit, die vollständige Serialisierung eines bestimmten Objekts mit einem anderen zu handhaben Klasse. – room13

+0

[Sie können hier 1 Überprüfen: angeben-Gruppe-per-Attribut] [1] [Auch hier 2: jms Serializer Bündel-Komplex-generated-Wert] [2] [ 1]: http://stackoverflow.com/questions/13665369/jmsserializerbundle-specify-group-per-attribute [2]: http://stackoverflow.com/questions/14475171/jmsserializerbundle-complex-generated-value –

Antwort

3

Der Serializer Bundle allein möglicherweise nicht für diese Situation genug sein, da es nur mit Serialisierung und Deserialisierung ist, nicht komplexe semantische Aufgaben.

würde ich vorschlagen, in FSCHateoasBundle suche ein ziemlich hypermedia-Format für Ihre API zu implementieren.

Verwandte Themen