JMSSerializerBundle — продолжить десериализацию в пользовательском обработчике

У меня есть собственный обработчик, который выполняет десериализацию моего объекта:

public function deserialize(   JsonDeserializationVisitor $visitor,
                               $data,
                               array $type,
                               DeserializationContext $context)

Я не хочу брать на себя всю работу по десериализации, я хочу сделать только некоторые из них. Например, у меня есть альбом (идентификатор, имя, описание, фотографии), и я хочу десериализовать «описание» самостоятельно, оставив всю остальную работу пакету.

    if (!empty($data['id']))
        $album = $albumManager->createWithId($data['id']);
    else
        $album = $albumManager->create();

    $album->setDescription($albumDescriptionParser->parse($data['description']));

    // and now I want to delegate other deserialization job to JMSSerializer
    // ....

    return $album;

Я знаю, что это делается с использованием контекста, посетителя и навигатора, но я не могу понять, как


person pleerock    schedule 02.01.2014    source источник


Ответы (1)


Хорошо, я нашел способ реализовать это. Кажется, это нелегко обработать в обработчике десериализации.

Вместо этого я использовал собственную реализацию интерфейса ObjectConstructorInterface и событие serializer.post_deserialize.

Процесс создания может быть обработан в пользовательской реализации ObjectConstructorInterface, и все «дополнительные настройки» могут быть установлены после фактической десериализации - когда происходит событие serializer.post_deserialize.

person pleerock    schedule 02.01.2014