【发布时间】:2012-09-06 14:16:25
【问题描述】:
假设我想创建一个类似于以下内容的 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;
}
现在,我的问题。创建如下所示的响应非常简单
<?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-attributes 的链接,例如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 响应?
【问题讨论】:
-
非常有趣的问题。在戳了一下之后,我认为没有其他解决方案,然后用仅用于序列化的附加属性污染您的实体......捆绑中似乎缺少的是处理特定对象与另一个对象的完整序列化的可能性类。
-
[您可以在此处检查 1:specify-group-per-attribute ][1] [此处还有 2:jms 序列化程序 bundle-complex-generated-value][2] [1]:@987654322 @[2]:stackoverflow.com/questions/14475171/…
标签: symfony symfony-2.1 hateoas jmsserializerbundle hypermedia