Php jms序列化程序通过注释自定义行为

Php jms序列化程序通过注释自定义行为,php,symfony,doctrine-orm,jmsserializerbundle,Php,Symfony,Doctrine Orm,Jmsserializerbundle,我有一个很大的实体,有很多数值。因为这些值中的大多数都有一个单位,所以我创建了一个@unit注释,将其直接放入模型中。现在我想序列化那个实体 让我们假设这样一个实体: class Entity { /** * @var string * * @ORM\Column(type="string", length=255) * @Assert\NotBlank() */ private $name; /** * @ORM\Column(type="s

我有一个很大的实体,有很多数值。因为这些值中的大多数都有一个单位,所以我创建了一个
@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"}
}
输出如下所示:

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"}
}
我希望它看起来像这样:

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;
}
那么,如何扩展(而不是覆盖)默认行为呢

编辑:我还尝试了预序列化和后序列化事件,但这两种事件都不起作用,因为序列化程序似乎在调用处理程序之前采用了该类型

class EntitySubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            [
                'event' => 'serializer.post_serialize',
                'method' => 'onPostSerialize',
                'class' => Entity::class,
           ],
       ];
    }
    public function onPostSerialize(ObjectEvent $event)
    {
        $entity = $event->getObject();
        /** @var \JMS\Serializer\JsonSerializationVisitor $visitor */
        $reader    = new AnnotationReader();
        // todo: read Unit annotation
        $visitor = $event->getVisitor();
        $visitor->addData('distance', 'some value');
    }
}