如何使用JMSSerializerBundle创build一个好的超媒体格式?
比方说,我想创build一个XML-响应,将如下所示:
<?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; }
现在,对我的问题。 创build如下所示的响应将非常简单
<?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>
条目不应该由实体指定,因为它不应该具体说明它的位置和方式。 你也可以想象更多的链接与不同的configuration,如edit
。
想到的一个解决scheme是监听特定对象的序列化事件的服务,并根据需要添加这些属性和标记。 该服务可以使用DI获取Request
, Router
服务等,以适合于所需格式的格式生成这些链接。 IE中的XML响应,它可以设置适当的types为application/media-format+xml
,而在json响应中,它可以生成类似
"links": [ { "rel": "payment", "type": "application/media-format+json", "href": "[...]" } ]
现在,在JMSSerializerBundle的文档中 ,我find@PreSerialize
和@PostSerialize
注释,但他们似乎只能调用被序列化的对象的方法。
有谁知道如何/如果这可以实现? 或者我必须使用Twig等模板引擎,并手动创buildXML响应?
Serializer Bundle本身可能不足以应付这种情况,因为它只涉及序列化和反序列化,而不是更复杂的语义任务。
我build议寻找FSCHateoasBundle为您的API实现一个漂亮的超媒体格式。