49

假设我想创建一个类似于以下内容的 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:atomand条目,因为它不应该知道它的位置和位置。您还可以想象更多具有不同 - 属性的链接,例如. 想到的一种解决方案是一种服务,它监听特定对象的序列化事件,并根据需要添加这些属性和标签。该服务可以使用 DI 来获取, -service 等以适合所请求格式的格式生成这些链接。IE 在 XML 响应中,它可以将适当的类型设置为<atom:link>reledit
RequestRouterapplication/media-format+xml,而在 json 响应中,它可以生成类似

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

现在,在JMSSerializerBundle 的文档中,我找到了@PreSerialize和的注释@PostSerialize,但它们似乎只能调用被序列化对象的方法。
有谁知道如何/是否可以实现?还是我必须使用 Twig 等模板引擎并手动创建 XML 响应?

4

1 回答 1

3

对于这种情况,单独的 Serializer Bundle 可能还不够,因为它只关注序列化和反序列化,而不是更复杂的语义任务。

我建议研究FSCHateoasBundle为您的 API 实现一个漂亮的超媒体格式。

于 2012-11-25T16:39:48.417 回答