Предположим, что я хочу создать 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="#" onclick="location.href='http://acme.com/products/1234/payment'; return false;" />
</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, как сериализовать Product-объект. Однако записи xmlns:atom
и <atom:link>
не должны указываться сущностью, поскольку в ней не должно быть понятия , как и , где. Вы могли бы также представить больше ссылок с различными атрибутами rel
, такими как edit
.
Одним из решений, которое приходит на ум, будет служба, которая прослушивает события сериализации для определенных объектов и добавляет эти атрибуты и теги по мере необходимости. Служба может использовать DI, чтобы получить Request
, Router
-сервис и т.д., Чтобы сгенерировать эти ссылки в формате, который подходит для запрошенного формата. I.E в XML-ответе, он может установить соответствующий тип application/media-format+xml
, тогда как в json-response он может генерировать нечто вроде
"links": [
{
"rel": "payment",
"type": "application/media-format+json",
"href": "[...]"
}
]
Теперь, в документации для JMSSerializerBundle, я нахожу аннотации для @PreSerialize
и @PostSerialize
, но они, похоже, только могут вызывать методы на объект сериализуется.
Кто-нибудь знает, как это сделать? Или мне нужно использовать механизм шаблонов, такой как Twig, и вручную создать XML-ответ?