fab2s/laravel-dt0

Laravel 对 fab2s/dt0 的支持

0.0.1 2024-04-28 15:46 UTC

This package is auto-updated.

Last update: 2024-08-29 19:51:48 UTC


README

CI QA codecov Latest Stable Version PRs Welcome License

Laravel 对 fab2s/dt0 的支持,这是一个 DTO (Data-Transfer-Object) PHP 实现,既可以确保可变性安全,又可以提供方便的方式来控制各种格式下的输入和输出。

安装

可以使用 composer 安装 Dt0

composer require "fab2s/laravel-dt0"

用法

Laravel Dt0 只为 Dt0 添加了验证实现和模型属性转换。所有其他功能都将完全相同。请查看 Dt0 了解更多。

转换器

除了 Dt0 转换器 之外,Laravel Dt0 还增加了一个 CollectionOfCaster,它可以用来为 Laravel 的 Collection 进行强类型转换

    #[Cast(in: new CollectionOfCaster(MyDt0::class))] // Dt0|UnitEnum|ScalarType|string
    public readonly Collection $prop;

它可以作为进行更多类型转换的灵感。

验证

Laravel Dt0 能够利用 Laravel 验证在公共属性的每个属性上。验证是在属性转换或实例化之前对输入数据进行执行。

Laravel Dt0 带有一个 Validator,可以利用 laravel 验证 的全部功能。

要在任何 Dt0 上使用它,只需添加 Validate 类属性

#[Validate(Validator::class)] // same as #[Validate(new Validator)]
class MyDt0 extends Dt0 {
    // ...
}

规则可以通过三种方式添加

  • 使用 Validate 类属性 的第二个参数

    use fab2s\Dt0\Attribute\Rule;
    use fab2s\Dt0\Attribute\Rules;
    use fab2s\Dt0\Attribute\Validate;
    use fab2s\Dt0\Laravel\Dt0;
    use fab2s\Dt0\Laravel\Validator;
    
    #[Validate(
        Validator::class,
        new Rules(
            propName: new Rule('string|size:2'),
            // ...
        ),
    )]
    class MyDt0 extends Dt0 {
        public readonly string $propName;
    }
  • 使用 Rules 类属性

    use fab2s\Dt0\Attribute\Rule;
    use fab2s\Dt0\Attribute\Rules;
    use fab2s\Dt0\Attribute\Validate;
    use fab2s\Dt0\Laravel\Dt0;
    use fab2s\Dt0\Laravel\Validator;
    
    #[Validate(Validator::class)]
    #[Rules(
        propName: new Rule(['required', 'string', 'size:2']),
        // ...
    )]
    class MyDt0 extends Dt0 {
        public readonly string $propName;
    }
  • 使用 Rule 属性属性

    use fab2s\Dt0\Attribute\Rule;
    use fab2s\Dt0\Attribute\Rules;
    use fab2s\Dt0\Attribute\Validate;
    use fab2s\Dt0\Laravel\Dt0;
    use fab2s\Dt0\Laravel\Validator;
    use fab2s\Dt0\Laravel\Tests\Artifacts\Rules\Lowercase;
    
    #[Validate(Validator::class)]
    class MyDt0 extends Dt0 {
        #[Rule(new Lowercase)] // or any custom rule instance
        public readonly string $propName;
    }

ValidatableDt0 中所示,上述三种的组合是允许的。

在重复的情况下,优先级顺序是 Validate,然后是 Rules,最后是 Rule。Dt0 对定义规则的方法没有意见。它们都会在进程每次编译时执行,并准备好供任何重用。

使用 withValidation 方法执行验证

// either get a Dt0 instance or a ValidationException
$dt0 = SomeValidatableDt0::withValidation(...Request::all());

模型属性转换

如果您想将 Dt0 用作 Laravel 模型属性,则可以直接将其转换为您的 Dt0,这得益于通用的转换 Dt0Cast

唯一的要求是您的 Dt0 扩展 fab2s\Dt0\Laravel\Dt0 或扩展 fab2s\Dt0\Dt0 并且 使用 fab2s\Dt0\Laravel\LaravelDt0Trait

use Illuminate\Database\Eloquent\Model;

class SomeModel extends Model
{
    protected $casts = [
        'some_dt0'          => SomeDt0::class,
        'some_nullable_dt0' => SomeNullableDt0::class.':nullable',
    ];
}

$model = new SomeModel;

$model->some_dt0 = '{"field":"value"}';
// or 
$model->some_dt0 = ['field' => 'value'];
// or 
$model->some_dt0 = SomeDt0::from(['field' => 'value']);

// then
$model->some_dt0->equals(SomeDt0::from('{"field":"value"}')); // true

$model->some_dt0 = null; // throws a NotNullableException
$model->some_nullable_dt0 = null; // works

// can thus be tried
$model->some_nullable_dt0 = SomeNullableDt0::tryFrom($anyInput);

要求

Dt0 已在 php 8.1 和 8.2 以及 Laravel 10 / 11 上进行测试

贡献

欢迎贡献力量,请随时提出问题和提交拉取请求。

许可证

Dt0 是开源软件,遵循MIT 许可协议