我遇到一个问题已经有好几次了,但我没有设法解决它。我使用 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);
}
}