tailflow / castable-dto
2.1.0
2022-03-03 12:06 UTC
Requires
- php: >=8.0
- ext-json: *
- illuminate/contracts: >=8.0
- spatie/data-transfer-object: >=3.0
Requires (Dev)
- orchestra/testbench: 6.0
- phpunit/phpunit: >=8.0
README
已弃用
请考虑使用 tailflow/dto。
您是否希望将 JSON 列转换为值对象?
此包提供了 Spatie 的 DataTransferObject
类的扩展版本,称为 CastableDataTransferObject
。
在底层,它实现了 Laravel 的 Castable
接口,并使用 Laravel 的自定义转换处理了 DataTransferObject
(或兼容数组)与您的 JSON 数据库列之间的序列化。
安装
您可以通过 composer 安装此包
composer require tailflow/castable-dto
用法
1. 创建您的 CastableDataTransferObject
请查看 Spatie 的 数据传输对象 包的说明,了解更多关于它们的 DataTransferObject
类能做什么。
namespace App\DataTansferObjects; use Tailflow\DataTransferObjects\CastableDataTransferObject; class Address extends CastableDataTransferObject { public string $country; public string $city; public string $street; }
2. 配置您的 Eloquent 属性以将其转换为它
请注意,这应该是数据库模式中的 jsonb
或 json
列。
namespace App\Models; use App\DataTansferObjects\Address; use Illuminate\Database\Eloquent\Model; class User extends Model { protected $casts = [ 'address' => Address::class, ]; }
然后就可以传递您的 Address
类的实例,或者只是一个具有兼容结构的数组。它将自动在您的类和 JSON 之间进行转换,数据在输入和输出过程中将进行验证。
$user = User::create([ // ... 'address' => [ 'country' => 'Japan', 'city' => 'Tokyo', 'street' => '4-2-8 Shiba-koen', ], ]); $residents = User::where('address->city', 'Tokyo')->get();
但最好的部分是,您可以使用领域特定的方法装饰您的类,使其成为一个强大的值对象。
$user->address->toMapUrl(); $user->address->getCoordinates(); $user->address->getPostageCost($sender); $user->address->calculateDistance($otherUser->address); echo (string) $user->address;
致谢
- 由 Jess Archer 开发的原始 包
许可
MIT 许可证(MIT)。请参阅 许可文件 了解更多信息。