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:atomおよび<atom:link>エントリはエンティティによって指定されるべきではありません。これは、それがどのように、どこに配置されているかという概念を持たないためです。relなど、さまざまな属性を持つリンクをさらに想像することもできますedit
頭に浮かぶ 1 つの解決策は、特定のオブジェクトのシリアル化イベントをリッスンし、これらの属性とタグを適切に追加するサービスです。サービスは DI を使用してRequestRouterサービスなどを取得し、要求された形式に適した形式でこれらのリンクを生成できます。XML 応答の IE では、適切なタイプを次のように設定できます。application/media-format+xml、一方、json-response では、次のようなものを生成できます

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

現在、JMSSerializerBundle のドキュメントで@PreSerialize、 、 、およびの注釈を見つけまし@PostSerializeたが、シリアル化されているオブジェクトのメソッドしか呼び出せないようです。
これが達成できるかどうか/方法を知っている人はいますか? それとも、Twig などのテンプレート エンジンを使用して手動で XML 応答を作成する必要がありますか?

4

1 に答える 1

3

シリアライザー バンドルだけでは、シリアライゼーションとデシリアライゼーションのみに関係し、より複雑なセマンティック タスクには関係しないため、この状況には十分ではない可能性があります。

FSCHateoasBundleを調べて、API にかなりのハイパーメディア形式を実装することをお勧めします。

于 2012-11-25T16:39:48.417 に答える