Как создать хороший гипермедиа формат, используя JMSSerializerBundle?

46

Предположим, что я хочу создать 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, как сериализовать 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-ответ?

  • 0
    Очень интересный вопрос Поработав немного, я думаю, что нет другого решения, кроме как загрязнять вашу сущность дополнительными атрибутами, используемыми только для сериализации ... Кажется, что в пакете отсутствует возможность обрабатывать полную сериализацию определенного объекта другим учебный класс.
  • 0
    [Вы можете проверить здесь 1: указать-группу-на-атрибут] [1] [Также здесь 2: комплексное сгенерированное значение-сериализатор jms] [2] [1]: stackoverflow.com/questions/13665369/… [ 2]: stackoverflow.com/questions/14475171/…
Теги:
symfony-2.1
jmsserializerbundle
hateoas
hypermedia

1 ответ

3

Для этой ситуации может быть недостаточно одного пакета Serializer, поскольку он касается только сериализации и десериализации, а не более сложных семантических задач.

Я бы предложил посмотреть FSCHateoasBundle, чтобы реализовать довольно гибкий формат для вашего API.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню