JMSSerializerBundle:处理同一实体属性的不同名称

时间:2016-07-22 14:13:39

标签: php symfony jmsserializerbundle

据我所知,通过组和/或版本控制等排除技术,可以序列化或不是实体字段,但我想要的是设置不同的“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序列化文件?

1 个答案:

答案 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" }

希望这个帮助