据我所知,通过组和/或版本控制等排除技术,可以序列化或不是实体字段,但我想要的是设置不同的“serialized_name”。
我有一个旧的ApiBundle,它序列化第三个包中的实体,现在我需要从NewAPiBundle序列化这个相同的实体,但是我需要为字段添加新名称而不更改Entity的属性名称(旧的api应该继续运行)< / p>
使用JSMSerializer可以实现这样的功能吗? :
Entity\User:
properties:
name:
groups: ['user_odlapi']
name:
groups: ['user_newapi']
serialized_name: 'username'
或许,是否可以根据请求url / Bundle编写两个不同的yml序列化文件?
答案 0 :(得分:2)
您可以按照here in the doc所述的方式对EventSubscriberInterface进行跟踪。
例如:
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
use JMS\Serializer\EventDispatcher\ObjectEvent;
...
class UserSerializerSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
[
'event' => 'serializer.post_serialize',
'class' => 'Entity\User',
'method' => 'onPostSerialize',
],
];
}
public function onPostSerialize(ObjectEvent $event)
{
$visitor = $event->getVisitor();
$user = $event->getObject();
$attributeName = 'name'; // default
if ($this->isInGroups(['user_newapi'], $event))
{
$attributeName = 'username';
}
$visitor->addData($attributeName, $user->getName());
}
private function isInGroups(array $validGroup, ObjectEvent $event)
{
$option = $event->getContext()
->attributes->get('groups')
->filter(function ($groups) use ($validGroup) {
return sizeof(array_intersect($groups, $validGroup))>0;
});
return !$option->isEmpty();
}
并注册,作为YML示例:
acme.user_serializer_subscriber:
class: Acme\DemoBundle\Subscriber\UserSerializerSubscriber
tags:
- { name: "jms_serializer.event_subscriber" }
希望这个帮助