我想在序列化实体的表示中添加一个自定义属性,该表示采用现有的实体属性,并使用现有服务以用户友好的方式对其进行格式化。
我定义了一个订阅者类,并注入了用于格式化现有实体属性的服务,并订阅了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
的唯一办法是虚拟属性输出依赖于服务,并且不应将任何依赖项注入实体。
答案 0 :(得分:2)
错误是由于实体本身已经公开了一个属性displayConfirmedOn
以进行序列化。当您的事件侦听器运行时,不允许向输出添加具有相同名称的属性,并且您会收到此错误。
只需停止在您的实体中公开该属性,然后该侦听器就可以添加同名属性。