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


JMSSerializerBundle, add field in post serialize

我遇到一个问题已经有好几次了,但我没有设法解决它。我使用 JMSSerializerBundle 在我的 Web 服务中序列化我的实体。因此,我必须序列化与对象 B 有关系的对象 A。在这个对象 B 中,我必须添加两个新字段,其数据是通过调用存储库 => 获得的,因此没有虚拟属性,因为这意味着在实体中注入服务是不好的。此外,我不必在对象 B 的所有序列化中添加这些字段,而只需当它包含在对象 A 中时。

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

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

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

就像下面的例子一样:使用 JMS 序列化程序捆绑包添加额外字段

但我的问题是我想在

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

提前谢谢你。

无法

在序列化事件订阅服务器中使用序列化程序。

相反,对象 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);
    }
}