【问题标题】:Symfony2 JMS Serializer - modify certain valuesSymfony2 JMS 序列化器 - 修改某些值
【发布时间】:2017-07-03 12:24:27
【问题描述】:

我必须使用现有项目,并且必须在序列化之前修改一些数据。一个简单的例子:

这是我的序列化程序目前返回的内容:

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

这就是我想要返回的:

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

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

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

【问题讨论】:

    标签: symfony serialization symfony-2.8


    【解决方案1】:

    您可以为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);
               }
            }
        }
    

    【讨论】:

      【解决方案2】:

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

      阅读此文档: http://jmsyst.com/libs/serializer/master/event_system

      【讨论】:

      • 如何访问 post_serialize 中的某个值?
      • 在您的订阅者功能中; /** @var JsonSerializationVisitor $visitor */ $visitor = $event->getVisitor(); $entity = $event->getObject();
      【解决方案3】:

      我认为您可以简单地使用 Accessor 注释来显式设置 getter。

      http://jmsyst.com/libs/serializer/master/reference/annotations#accessor

      /** @JMS\Accessor(getter="getReward") */
      private $reward;
      
      public function getReward()
      {
          switch ($this->reward) {
                  case 'reg':
                      return 'Registration';
                  case 'inv':
                      return 'inviting another user';
                  default:
                      return $this->reward;
              }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多