2017-07-03 75 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); 
      } 
     } 
    }