在哪里构建使用类型提示属性反序列化嵌套对象的方法?

112*_*ion 6 php serialization symfony

我正在尝试将数据从 json 转换为 DTO 类。我正在使用Symfony 序列化程序

但是当我尝试反序列化时。它不解析类型 from 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;
}
Run Code Online (Sandbox Code Playgroud)

序列化器配置:

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

];

$serializer new Serializer($normalizers, [new JsonEncoder()]);
Run Code Online (Sandbox Code Playgroud)

给我错误时的测试用例:

TypeError : Typed property 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');

Run Code Online (Sandbox Code Playgroud)

yiv*_*ivi 5

Symfony 5.1 将原生支持这一点:

PropertyInfo组件使用多个源(Doctrine 元数据、PHP 反射、PHPdoc 配置等)提取有关 PHP 类属性的信息。在 Symfony 5.1 中,我们改进了该组件,也可以从 PHP 类型属性中提取信息

在此之前,您需要向序列化器提供一些信息,以便它能够推断类型。一个 PhpDoc 或一个类型化的 setter 就足够了。