当我尝试使用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项目中测试过了。
是我遗漏了什么,还是这是序列化程序组件中的一个错误?
1条答案
按热度按时间jum4pzuy1#
如果它可以帮助,这里我正在使用: