Пользовательское поведение сериализатора jms через аннотацию

У меня есть очень большой объект с большим количеством числовых значений. Поскольку у большинства этих значений есть единица измерения, я создал аннотацию @Unit, чтобы поместить это право в модель. Теперь я хочу сериализовать этот объект.

Предположим, что существует такая сущность:

class Entity {

  /**
   * @var string
   *
   * @ORM\Column(type="string", length=255)
   * @Assert\NotBlank()
   */
  private $name;

  /**
   * @ORM\Column(type="smallint", nullable=true)
   * @Unit("m")
   */
  private $distance;
}

Вывод выглядит примерно так:

{
  "name": "bla",
  "distance": 1.20
}

Я хочу, чтобы это выглядело так:

{
  "name": "bla",
  "distance": {"value": 1.20, "unit": "m", "string": "1.20 m"}
}

Я пытался использовать собственный обработчик, но, насколько мне известно, нет возможности вызвать обработчик по умолчанию.

public function handler(JsonSerializationVisitor $visitor, $data, array $type, Context $context)
{
    $result = $context->accept($data);
    // result is empty
    // i can add stuff here but not call the default handler
    return $result;
}

Итак, как я могу расширить (не перезаписать) поведение по умолчанию?

РЕДАКТИРОВАТЬ: я также пробовал событие до и после сериализации, которое также не работает, потому что кажется, что сериализатор принимает тип перед вызовом обработчика.


person Nemo64    schedule 08.08.2014    source источник