jessarcher / laravel-castable-data-transfer-object
使用Spatie的数据传输对象类,在Laravel中自动将JSON列转换为丰富的PHP对象
Requires
- php: ^8.0
- illuminate/contracts: ^8.0|^9.0|^10.0
- spatie/data-transfer-object: ^3.0.4
- thecodingmachine/safe: ^1.3|^2.0
Requires (Dev)
- brianium/paratest: ^6.2
- mockery/mockery: ^1.4
- nunomaduro/collision: ^5.3|^6.0
- orchestra/testbench: ^6.15|^7.0|^8.0
- phpunit/phpunit: ^9.5
- vimeo/psalm: ^4.4|^5.6
README
Laravel很棒。Spatie的数据传输对象包对于PHP来说也很棒。它们已经是好朋友了,但现在他们要把关系提升到下一个层次 💕
你是否曾经想要将你的JSON列转换为值对象?
此包提供了Spatie的DataTransferObject
类的扩展版本,称为CastableDataTransferObject
。
在内部,它实现了Laravel的Castable
接口,并使用Laravel的custom cast
来处理在DataTransferObject
(或兼容的数组)和你的JSON数据库列之间的序列化。
关于它实际做了什么以及背后的动机的深入解释,请查看产生的博客文章。
此包还已在Laravel News上展示!
安装
您可以通过composer安装此包
composer require jessarcher/laravel-castable-data-transfer-object
用法
1. 创建你的CastableDataTransferObject
查看readme以了解Spatie的数据传输对象包,了解更多关于他们的DataTransferObject
类可以做什么。
namespace App\Values; use JessArcher\CastableDataTransferObject\CastableDataTransferObject; class Address extends CastableDataTransferObject { public string $street; public string $suburb; public string $state; }
(注意:我喜欢将它们放在App\Values
中,因为我在将它们用作值对象,而不仅仅是普通的数据传输对象。你可以把它放在任何你喜欢的地方!)
2. 配置你的Eloquent属性以将其转换为它
请注意,这应该是你的数据库模式中的jsonb
或json
列。
namespace App\Models; use App\Values\Address; use Illuminate\Database\Eloquent\Model; class User extends Model { protected $casts = [ 'address' => Address::class, ]; }
就这样!你现在可以传递你的Address
类的实例,甚至只是一个具有兼容结构的数组。它将自动在类和JSON之间进行转换,并在存储时进行验证。
$user = User::create([ // ... 'address' => [ 'street' => '1640 Riverside Drive', 'suburb' => 'Hill Valley', 'state' => 'California', ], ]) $residents = User::where('address->suburb', 'Hill Valley')->get();
但最好的部分是,你可以通过添加领域特定方法来装饰你的类,将其转变为功能强大的值对象。
$user->address->toMapUrl(); $user->address->getCoordinates(); $user->address->getPostageCost($sender); $user->address->calculateDistance($otherUser->address); echo (string) $user->address;
为空数据库值使用默认值
默认情况下,如果数据库值为null
,则模型属性也将为null
。然而,有时你可能希望使用一些默认值来实例化属性。
为了实现这一点,你可以提供一个额外的nullable
Cast Parameter,以确保转换器被实例化。
namespace App\Models; use App\Values\Address; use Illuminate\Database\Eloquent\Model; class User extends Model { protected $casts = [ 'settings' => Settings::class . ':nullable', ]; }
这将确保即使数据库中的settings
列是null
,Settings
转换器也会被实例化。
然后你可以指定一些默认值,这些值将用于代替。
use JessArcher\CastableDataTransferObject\CastableDataTransferObject; class Settings extends CastableDataTransferObject { public string $title = 'Default'; }
控制序列化
你可以通过向你的对象添加CastUsingJsonFlags
属性来向转换器提供用于序列化的标志
use JessArcher\CastableDataTransferObject\CastableDataTransferObject; use JessArcher\CastableDataTransferObject\CastUsingJsonFlags; #[CastUsingJsonFlags(encode: JSON_PRESERVE_ZERO_FRACTION)] class Address extends CastableDataTransferObject {}
测试
composer test
变更日志
请参阅变更日志以获取有关最近更改的更多信息。
贡献
请参阅贡献指南以获取详细信息。
安全
如果您发现任何与安全相关的问题,请通过电子邮件jess@jessarcher.com进行报告,而不是使用问题跟踪器。
致谢
许可协议
MIT 许可协议 (MIT)。有关更多信息,请参阅许可文件。
Laravel 包模板
此包是使用Laravel 包模板生成的。