跳至正文

更新日志 1.3.0 — 2023 年 2 月 8 日

重要变更

处理自定义枚举构造函数注册

现在可以为枚举注册自定义构造函数,就像为类注册自定义构造函数一样。

(new \CuyZ\Valinor\MapperBuilder())
    ->registerConstructor(
        // Allow the native constructor to be used
        SomeEnum::class,

        // Register a named constructor
        SomeEnum::fromMatrix(...)
    )
    ->mapper()
    ->map(SomeEnum::class, [
        'type' => 'FOO',
        'number' => 'BAR',
    ]);

enum SomeEnum: string
{
    case CASE_A = 'FOO_VALUE_1';
    case CASE_B = 'FOO_VALUE_2';
    case CASE_C = 'BAR_VALUE_1';
    case CASE_D = 'BAR_VALUE_2';

    /**
     * @param 'FOO'|'BAR' $type
     * @param int<1, 2> $number
     * /
    public static function fromMatrix(string $type, int $number): self
    {
        return self::from("{$type}_VALUE_{$number}");
    }
}

枚举构造函数可以用于特定模式:

enum SomeEnum
{
    case FOO;
    case BAR;
    case BAZ;
}

(new \CuyZ\Valinor\MapperBuilder())
    ->registerConstructor(
        /**
         * This constructor will be called only when pattern
         * `SomeEnum::BA*` is requested during mapping.
         *
         * @return SomeEnum::BA*
         */
        fn (string $value): SomeEnum => /* Some custom domain logic */
    )
    ->mapper()
    ->map(SomeEnum::class . '::BA*', 'some custom value');

请注意,此提交需要大量的重构工作,导致包含枚举和其他类型的联合类型回归。由于这些情况被认为是边缘性的,因此这种更改被认为是非破坏性的。

新功能

  • 处理自定义枚举构造函数注册( 217e12 )

其他

  • 将枚举类型处理为类类型( 5a3caf )