初始化到一个集合对象不与Symfony序列化器一起工作(可能是Symfony错误?)

vyswwuz2  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(135)

当我尝试使用Symfony序列化器来初始化一个集合对象时,我总是得到一个空集合。
我有以下只读类:

final readonly class Order
{
    public function __construct(public Items $items) 
    {
    }
}

final readonly class Items
{
    /**
     * @var array<Item>
     */
    public array $items;

    public function __construct(Item ...$items)
    {
        $this->items = $items;
    }
}

final readonly class Item
{
    public function __construct(public string $code) 
    {
    }
}

序列化器的设置如下:

$serializer = new Serializer(
    normalizers: [
        new ArrayDenormalizer(),
        new ObjectNormalizer(
            propertyTypeExtractor: new PropertyInfoExtractor(
                typeExtractors: [new PhpDocExtractor(), new ReflectionExtractor()],
            ),
        ),
    ],
    encoders: [
        new JsonEncoder()
    ]
);

在从json转换后,Order对象的$items属性 * 是 * Items的示例,但Items$items数组仍然为空:

$json = json_encode([
    'items' => [
        ['code' => 'test-code-1'],
        ['code' => 'test-code-2'],
    ],
]);

$order = $serializer->deserialize($json, Order::class, 'json');

var_dump($order->items->items); 

Output:
array(0) { }

作为一种变通方法,我删除了Items类,并将items数组移动到Order对象本身:

final readonly class Order
{
    public function __construct(
        /** @var array<Item> */        
        public array $items
    ){
    }
}

final readonly class Item
{
    public function __construct(public string $code) 
    {
    }
}

这将产生预期的结果:

$order = $serializer->deserialize($json, Order::class, 'json');

var_dump($order->items); 

Output:
array(2) { 
    [0]=> object(Item)#1467 (1) { 
        ["code"]=> string(11) "test-code-1" 
    } 
    [1]=> object(Item)#1465 (1) { 
        ["code"]=> string(11) "test-code-2" 
    }
}

这种方法的缺点是,我必须添加docblocks,告诉序列化程序$items是一个包含Item对象的数组。
我已经在Symfony 5.4和6.3项目中测试过了。
是我遗漏了什么,还是这是序列化程序组件中的一个错误?

jum4pzuy

jum4pzuy1#

如果它可以帮助,这里我正在使用:

$serializer = new Serializer([
    new ProblemNormalizer(),
    new JsonSerializableNormalizer(),
    new ConstraintViolationListNormalizer(),
    new DateTimeNormalizer($context),
    new DateTimeZoneNormalizer(),
    new DateIntervalNormalizer(),
    new DataUriNormalizer(),
    new ArrayDenormalizer(),
    new ObjectNormalizer(null, null, null, new ReflectionExtractor()),
], [
    new JsonEncoder(),
]);

相关问题