跳至正文

更新日志 1.17.0 — 2025 年 6 月 20 日

重要变更

灵活的铸造设置分割

映射器设置enableFlexibleCasting已被(温和地)弃用,取而代之的是三种不同的模式,这保证了与以前相同的功能。

允许标量值转换:

启用此设置后,标量类型将接受可转换值:

  • 整数类型将接受任何有效的数值,例如字符串值"42" 。

  • 浮点类型将接受任何有效的数值,例如字符串值"1337.42" 。

  • 字符串类型将接受任何实现Stringable接口的整数、浮点数或对象。

  • 布尔类型将接受任何真值或假值:

    • (string) "true" 、 (string) "1"和(int) 1将被转换为true
    • (string) "false" 、 (string) "0"和(int) 0将被转换为false
(new \CuyZ\Valinor\MapperBuilder())
    ->allowScalarValueCasting()
    ->mapper()
    ->map('array{id: string, price: float, active: bool}', [
        'id' => 549465210, // Will be cast to string
        'price' => '42.39', // Will be cast to float
        'active' => 1, // Will be cast to bool
    ]);

允许非顺序列表:

默认情况下,列表类型仅接受从 0 开始的连续键。

此设置允许映射器将关联数组转换为具有顺序键的列表。

(new \CuyZ\Valinor\MapperBuilder())
    ->allowNonSequentialList()
    ->mapper()
    ->map('list<int>', [
        'foo' => 42,
        'bar' => 1337,
    ]);

// => [0 => 42, 1 => 1337]

允许未定义的值:

允许映射器接受未定义的值(输入中缺少),方法是将它们转换为null (如果当前类型可为 null)或空数组(如果当前类型是对象或可迭代对象)。

(new \CuyZ\Valinor\MapperBuilder())
    ->allowUndefinedValues()
    ->mapper()
    ->map('array{name: string, age: int|null}', [
        'name' => 'John Doe',
        // 'age' is not defined
    ]);

// => ['name' => 'John Doe', 'age' => null]

新功能

  • 三种不同模式下的拆分灵活铸造设置 ( 02ef8e )

其他

  • 简化ValueNode实现 ( 7e6ccf )