次のような 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
など、さまざまな属性を持つリンクをさらに想像することもできますedit
。
頭に浮かぶ 1 つの解決策は、特定のオブジェクトのシリアル化イベントをリッスンし、これらの属性とタグを適切に追加するサービスです。サービスは DI を使用してRequest
、Router
サービスなどを取得し、要求された形式に適した形式でこれらのリンクを生成できます。XML 応答の IE では、適切なタイプを次のように設定できます。application/media-format+xml
、一方、json-response では、次のようなものを生成できます
"links": [
{
"rel": "payment",
"type": "application/media-format+json",
"href": "[...]"
}
]
現在、JMSSerializerBundle のドキュメントで@PreSerialize
、 、 、およびの注釈を見つけまし@PostSerialize
たが、シリアル化されているオブジェクトのメソッドしか呼び出せないようです。
これが達成できるかどうか/方法を知っている人はいますか? それとも、Twig などのテンプレート エンジンを使用して手動で XML 応答を作成する必要がありますか?