2012-09-13 69 views
48

可以說,我想創建一個XML響應這種意願看起來像下面這樣:如何使用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> 

由於看起來像下面的域模型:

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

    [..] 
} 

和貨幣類沿線:

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

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

現在,對我的問題。這將是非常簡單的創建一個看起來像下面

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

使用任何註釋,XML或YAML告訴JMSSerializerBundle如何序列化的產品對象的響應。然而,xmlns:atom<atom:link>條目不應該由實體指定,因爲它不應該有的概念它的位置。您還可以想象更多與不同rel-屬性的鏈接,例如edit
想到的一個解決方案是監聽特定對象的序列化事件的服務,並根據需要添加這些屬性和標記。該服務可以使用DI來獲得Request,Router -service等以適合於所請求格式的格式生成這些鏈接。 IE在XML響應,它可以設置相應的類型application/media-format+xml,而在JSON響應,也可能產生類似

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

現在,在the documentation for JMSSerializerBundle,我找到@PreSerialize註釋和@PostSerialize,但他們似乎只能調用被序列化的對象的方法。
有誰知道/如果這可以實現?或者我必須使用Twig等模板引擎並手動創建XML響應?

+0

非常有趣的問題。經過一段時間,我沒有其他的解決方案,然後使用只用於序列化的附加屬性來污染你的實體...... bundle中缺少的東西是處理一個特定對象與另一個對象的完整序列化的可能性類。 – room13

+0

[可以檢查這裏1:指定基團的每個屬性] [1] [同樣在這裏2:JMS串行束複合物生成的值] [2] [ 1]:http://stackoverflow.com/questions/13665369/jmsserializerbundle-specify-group-per-attribute [2]:http://stackoverflow.com/questions/14475171/jmsserializerbundle-complex-generated-value –

回答

3

對於這種情況,Serializer Bundle本身可能還不夠,因爲它只涉及序列化和反序列化,而不是更復雜的語義任務。

我建議看看FSCHateoasBundle爲您的API實現漂亮的超媒體格式。