Symfony2 JMS Serializer - изменить определенные значения

Мне нужно работать с существующим проектом, и мне нужно изменить некоторые данные, прежде чем они будут сериализованы. Простой пример:

Вот что возвращает мой сериализатор на данный момент:

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

И это то, что я хочу вернуть:

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

Я хочу переписать глупые строки, поступающие из базы данных, в действительно читаемые выходные данные. Поэтому мне нужно запустить str_replace для определенных полей определенных сущностей. Как я могу этого добиться?

Я попытался создать своего собственного посетителя, но, похоже, у него есть возможность изменить только «visitString», что недостаточно конкретно. Есть ли другой способ сделать это?


person Chi    schedule 03.07.2017    source источник


Ответы (3)


Вы можете создать событие «Подписчик на 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);
           }
        }
    }
person Petro Popelyshko    schedule 03.07.2017

вы можете использовать событие serializer.post_serialize и заменить свои строки.

Прочтите этот документ: http://jmsyst.com/libs/serializer/master/event_system

person Mert Öksüz    schedule 03.07.2017
comment
Как получить доступ к определенному значению в post_serialize? - person Chi; 03.07.2017
comment
в вашей функции подписчика; /** @var JsonSerializationVisitor $visitor */ $visitor = $event->getVisitor(); $entity = $event->getObject(); - person Mert Öksüz; 03.07.2017

Я думаю, вы можете просто использовать аннотацию Accessor, чтобы явно установить геттер.

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;
        }
}
person HoangND    schedule 04.07.2017