JMS Serializer:序列化实体的自定义属性

时间:2014-04-15 08:40:24

标签: symfony serialization jmsserializerbundle

我想在序列化实体的表示中添加一个自定义属性,该表示采用现有的实体属性,并使用现有服务以用户友好的方式对其进行格式化。

我定义了一个订阅者类,并注入了用于格式化现有实体属性的服务,并订阅了serializer.pre_serialize,如下所示:

class UserSerializationSubscriber implements EventSubscriberInterface
{
    private $coreTwigExtension;

    private $user;

    public function setCoreTwigExtension(TwigExtension $coreTwigExtension)
    {
        $this->coreTwigExtension = $coreTwigExtension;
    }

    public function setUserService(UserService $user)
    {
        $this->user = $user;
    }

    public static function getSubscribedEvents()
    {
        return array(
            array(
                'event' => 'serializer.pre_serialize', 
                'method' => 'onObjPreSerialize', 
                'class' => 'Some\Bundle\Entity\EntityClass',
                'format' => 'json'
            )
        );
    }

    public function onObjPreSerialize(PreSerializeEvent $event)
    {
        $context = $event->getContext();
        $context->attributes->get('groups')->map(
            function(array $groups) use ($event) {
                if (in_array('somegroup', $groups)) {
                    $obj= $event->getObject();

                    if ($obj->getConfirmedOn()) {
                         $contextualDate = $this->coreTwigExtension->getContextualDate($obj->getConfirmedOn());
                         $event->getVisitor()->addData('displayConfirmedOn', $contextualDate);
                    }
                }
            }
        );
    }

}

订阅者注册:

some_bundle.handler.serialization:
    class: Some\Bundle\Handler\ObjectSerializationSubscriber
    calls:
        - [setCoreTwigExtension, ['@bundle_core.twig.extension']]
        - [setUserService, ['@some_bundle.service.user']]
    tags:
        - { name: jms_serializer.event_subscriber }

当我序列化一个实体的数组/集合Some \ Bundle \ Entity \ EntityClass时,我收到以下错误:

There is already data for "displayConfirmedOn".

我该如何解决这个问题?阻止我在实体中使用@VirtualProperty的唯一办法是虚拟属性输出依赖于服务,并且不应将任何依赖项注入实体。

1 个答案:

答案 0 :(得分:2)

错误是由于实体本身已经公开了一个属性displayConfirmedOn以进行序列化。当您的事件侦听器运行时,不允许向输出添加具有相同名称的属性,并且您会收到此错误。

只需停止在您的实体中公开该属性,然后该侦听器就可以添加同名属性。