2017-07-03 74 views
1

我必须使用现有的项目,我必须修改一些数据,然后序列化。一个简单的例子:Symfony2 JMS串行器 - 修改某些值

这是目前我的串行的回报是什么:

[ 
    { 
    "id": 3, 
    "reward": "reg" 
    }, 
    { 
    "id": 4, 
    "reward": "inv" 
    }, 
] 

而这正是我想要返回:

[ 
    { 
    "id": 3, 
    "reward": "Registration" 
    }, 
    { 
    "id": 4, 
    "reward": "inviting another user" 
    }, 
] 

我想重写来自愚蠢的字符串数据库到实际可读的输出。所以我必须在某些实体的某些字段上运行str_replace。我怎样才能做到这一点?

我试着创建自己的访问者,但似乎只能改变“visitString”,这并不够具体。有没有其他方法可以做到这一点?

回答

0

你可以使用serializer.post_serialize事件,你可以替换你的字符串。

阅读本文件: http://jmsyst.com/libs/serializer/master/event_system

+0

如何我访问post_serialize一定的价值? – Chi

+0

在你的用户功能; '/ ** @var JsonSerializationVisitor $ visitor */ $ visitor = $ event-> getVisitor(); $ entity = $ event-> getObject();' –

0

您可以创建用户到serializer.post_serialize事件,并修改数据是这样的:

use JMS\Serializer\EventDispatcher\EventSubscriberInterface; 
use JMS\Serializer\EventDispatcher\ObjectEvent; 

    class RewardSerializerEventSubscriber implements EventSubscriberInterface 
    { 
     /** 
     * Returns the events to which this class has subscribed. 
     * 
     * @return array 
     */ 
     public static function getSubscribedEvents() 
     { 
      return [ 
       ['event' => 'serializer.post_serialize', 'method' => 'onSerialize', 'class' => YourReward::class], 
      ]; 
     } 

     public function onSerialize(ObjectEvent $event) 
     { 
      /** @var YOURENTITY $object */ 
      $object = $event->getObject(); 
      $visitor = $event->getVisitor(); 
      if ($visitor->hasData('reward')) { 
       $reward = $object->getReward(); 
       switch ($reward) { 
        case 'reg': 
         $reward = "Registration"; 
         break; 
        case 'inv': 
         $reward = 'inviting another user'; 
         break; 
        default: 
         break; 
       } 
       $visitor->setData("reward", $reward); 
      } 
     } 
    }