JMSSerializerBundle,在后序列化中添加字段

时间:2016-02-03 09:39:58

标签: php symfony jmsserializerbundle

我遇到问题很多次,我没有设法解决它。我使用JMSSerializerBundle来序列化我的Web服务中的实体。所以我必须序列化一个与对象B有关系的对象A.在这个对象B中,我必须添加两个新字段,其数据是通过调用repository =>获得的。所以没有虚拟财产,因为这意味着在实体中注入服务是坏的。此外,我不必在对象B的所有序列化中添加这些字段,但仅限于它包含在对象A中。

所以我想到了听众,我制作了一个听取序列化事件的监听器,用于对象A的序列化,我想将字段添加到对象A中包含的对象B.我认为这是相当常见的但我不明白Visitor(通过ObjectEvent函数中postSerialize()给出的)是如何工作的。

我们可以很容易地制作一个

// (here the object A is recovered) 
$event->getObject()->getVisitor()->AddData('someKey', 'someValue');

就像下面的例子一样: Add extra fields using JMS Serializer bundle

但我的问题是我想在对象A中包含的对象B中添加字段,我没有在文档中找到任何关于此的示例甚至信息:(任何人都可以帮忙吗?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

无法在序列化事件订阅者内部使用序列化器。

相反,可以在序列化之前将对象B包含在对象A中(如果使用ORM,请不要映射它):

    namespace App\Entity;

use JMS\Serializer\Annotation as JMS;

class ObjectA
{
    /**
     * @JMS\Expose
     */
    private $objectB;

    public function getObjectB(): ObjectB
    {
        return $this->objectB;
    }

    public function setObjectB(ObjectB $objectB): self
    {
        $this->objectB = $objectB;

        return $this;
    }
}

现在使用预序列化:

namespace App\Subscriber;

use App\Entity\ObjectA;
use JMS\Serializer\EventDispatcher\Events;
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
use JMS\Serializer\EventDispatcher\ObjectEvent;

class ObjectASubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return [
            [
                'event' => Events::PRE_SERIALIZE,
                'method' => 'onPreSerialize',
                'class' => ObjectA::class,
            ],
        ];
    }

    public function onPreSerialize(ObjectEvent $event)
    {
        $objectA = $event->getObject();
        $objectB = /** Retrieving here */

        $objectA->setObjectB($objectB);
    }
}