我有一个非常大的实体,有很多数值。因为这些值中的大多数都有一个单元,所以我创建了一个@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;
}
那么如何扩展(而不是覆盖)默认行为呢?
编辑:我也尝试过序列化前后事件,因为看起来序列化程序在调用处理程序之前就假定了类型,所以它不起作用。
答案 0 :(得分:0)
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');
}
}