Сериализатор JMS десериализуется с абстрактным родительским классом

У меня есть абстрактный родительский класс (сопоставленный супер), у которого есть несколько детей с различными свойствами, которые яЯ хотел бы десериализовать. Я'Я храню данные, используя MongoDB и Doctrine ODM, поэтому у меня также есть поле дискриминатора, которое сообщает доктрине, какой подкласс используется (и также имеет свой собственный "тип" свойство ontop, которое используется в другом месте, чтобы определить, какой класс обрабатывается в данный момент).

При десериализации моей модели я получаю исключение, говорящее мне, что невозможно создать экземпляр абстрактного класса (ofcourse) - теперь яМне интересно, как я могу сказать JMS Deserializer, какой унаследованный класс он должен использовать (вот почему я использую пользовательскийtype Например, переменная экземпляра - потому что у меня нет доступа к доктринеотображение поля дискриминатора).

Я могу успешно подключиться кpreDeserializeEvent- так, может быть, можно сделать некоторые переключения / дела там (или с помощью)?

Моя модель вкратце (абстрактный класс):


Один из подклассов


Еще один тест былне делает Модульный класс рефератов и создание собственного статического метода

/**
 *
 * @Serializer\HandlerCallback("json", direction="deserialization")
 * @param JsonDeserializationVisitor $visitor
 */
public static function deserializeToObject(JsonDeserializationVisitor $visitor)
{
  // modify visitor somehow to return an instance of the desired inherited module class??
}

есть идеи?

 ioleo28 февр. 2014 г., 16:47
ты должен скопировать свойОбновить" как ответчик и пометить этот вопрос как разрешенный - таким образом, другие, у кого может быть такая же проблема, будут ясно видеть, что на этой странице есть рабочее решение
 con28 февр. 2014 г., 20:02
хорошая точка зрения. сделанный.

Ответы на вопрос(1)

Решение Вопроса

к сожалению, это еще не задокументировано:https://github.com/schmittjoh/serializer/blob/master/tests/JMS/Serializer/Tests/Fixtures/Discriminator/Vehicle.php

Документация обновленаhttp://jmsyst.com/libs/serializer/master/reference/annotations#discriminator

namespace JMS\Serializer\Tests\Fixtures\Discriminator;

use JMS\Serializer\Annotation as Serializer;

/**
 * @Serializer\Discriminator(field = "type", map = {
 *    "car": "JMS\Serializer\Tests\Fixtures\Discriminator\Car",
 *    "moped": "JMS\Serializer\Tests\Fixtures\Discriminator\Moped",
 * })
 */
abstract class Vehicle
{
    /** @Serializer\Type("integer") */
    public $km;

    public function __construct($km)
    {
        $this->km = (integer) $km;
    }
}
 ironchicken26 сент. 2018 г., 12:54
Пытаясь использовать это для десериализации, я получаю: "LogicErrorИмя поля дискриминатора...» для базового класса "...» не был найден во входных данных, Но я неЯ не хочу, чтобы входные данные имели это поле. Поле только для преодоления PHP "система типов ".

Ваш ответ на вопрос