我遇到问题很多次,我没有设法解决它。我使用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中添加字段,我没有在文档中找到任何关于此的示例甚至信息:(任何人都可以帮忙吗?
提前谢谢。
答案 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);
}
}