fab2s / laravel-dt0
Laravel 对 fab2s/dt0 的支持
Requires
- php: ^8.1
- fab2s/dt0: ^0.0.1
- illuminate/translation: ^10.0|^11.0
- illuminate/validation: ^10.0|^11.0
Requires (Dev)
- laravel/pint: ^1.10
- orchestra/testbench: ^8.0|^9.0
- phpunit/phpunit: ^10.0
README
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 许可协议。