我试着按照这个答案: Add extra fields using JMS Serializer bundle
但没有变化..
我希望在发送之前向序列化实体(在json中)添加额外的字段。有没有我错过的东西?
这是我的听众:
<?php
namespace My\MyBundle\Listener;
use JMS\DiExtraBundle\Annotation\Service;
use JMS\DiExtraBundle\Annotation\Tag;
use JMS\DiExtraBundle\Annotation\Inject;
use JMS\DiExtraBundle\Annotation\InjectParams;
use Symfony\Component\HttpKernel\Event\PostResponseEvent;
use My\MyBundle\Entity\Dossier;
use JMS\Serializer\Handler\SubscribingHandlerInterface;
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
use JMS\Serializer\EventDispatcher\PreSerializeEvent;
use JMS\Serializer\EventDispatcher\ObjectEvent;
use JMS\Serializer\GraphNavigator;
use JMS\Serializer\JsonSerializationVisitor;
/**
* Add data after serialization
*
* @Service("my.listener.serializationlistener")
* @Tag("jms_serializer.event_subscriber")
*/
class SerializationListener implements EventSubscriberInterface
{
/**
* @inheritdoc
*/
static public function getSubscribedEvents()
{
return array(
array('event' => 'serializer.post_serialize', 'class' => 'My\MyBundle\Entity\Dossier', 'method' => 'onPostSerialize'),
);
}
public function onPostSerialize(ObjectEvent $event)
{
$event->getVisitor()->addData('someKey','someValue');
}
}
和我的控制器中的呼叫:
$serializer = $this->container->get('jms_serializer');
$res = $serializer->serialize($dossier, 'json');
我还添加了以下服务声明:
services:
my.mybundle.listener:
class: My\MyBundle\Listener\SerializationListener
我声明了另一个服务,当我更改其声明名称symfony give和error时,而不是当我使用侦听器服务时。
提前致谢
答案 0 :(得分:1)
也许,您忘了添加标签。你的听众声明看起来应该是这样的
services:
my.bundle.listener:
class: My\MyBundle\Listener\SerializationListener
tags:
- { name: jms_serializer.event_subscriber }
答案 1 :(得分:0)
$visitor = $event->getVisitor();
$visitor->visitProperty(new StaticPropertyMetadata('', 'some_key', null),'some_key');
addData
方法用于旧版本的JMS序列化器。不要忘记导入StaticPropertyMetadata
。