Где построить способ десериализации вложенного объекта со свойством подсказки типа? - PullRequest
4 голосов
/ 10 марта 2020

Я пытаюсь преобразовать данные из json в класс DTO. Я использую Symfony сериализатор .

Но когда я пытаюсь десериализовать. Он не анализирует тип из typed property, я думаю, Symfony пока не поддерживает типизированное свойство формы десериализации. Это так? Должен ли я реализовать свой?

DTO:

class ElkUser
{
    public string     $partnerUuid;
    public string     $contractUuid;
    public DealerInfo $dealerInfo;
}

class DealerInfo
{
    public string $description;
    public int $dealerId;
    public string $dealerName;
    public bool $enabled;
    public string $registrationDate;
}

Конфигурация сериализатора:

$normalizers = [
    new DateTimeNormalizer(),
    new ObjectNormalizer(
        null,
        null,
        null,
        new ReflectionExtractor
    ),

];

$serializer new Serializer($normalizers, [new JsonEncoder()]);

Тестовый случай, когда выдают ошибку:

TypeError: Свойство Typed App \ Services \ CreditPilot \ ElkUser :: $ dealerInfo должен быть экземпляром App \ Services \ CreditPilot \ DealerInfo, используемый массив

$json = <<< JSON
{
  "partnerUuid": "string",
  "contractUuid": "string",
  "dealerInfo": {
    "dealerId": 0,
    "dealerName": "string",
    "enabled": true,
    "registrationDate": "2020-03-10T12:49:08.367Z",
    "contract": {
      "contractNumber": "string",
      "enabled": true,
      "creationDate": "2020-03-10T12:49:08.367Z"
    }
  }
}
JSON;

$serializer->deserialize($json, ElkUser::class, 'json');

1 Ответ

1 голос
/ 10 марта 2020

Этот будет изначально поддерживаться в Symfony 5.1 :

Компонент PropertyInfo извлекает информацию о свойствах классов PHP, используя несколько источники (Doctrine метаданные, PHP отражение, PHPdo c config, et c.) В Symfony 5.1 мы улучшили этот компонент, чтобы также извлекать информацию из PHP типизированных свойств.

Перед этим вам нужно передать некоторую информацию в сериализатор, чтобы он мог вывести тип. PhpDo c или печатный сеттер может быть достаточно.

...