tailflow / dto
一个简单轻量级的 Laravel 数据传输对象 (DTO) 实现,支持可选的转换支持。
1.0.2
2022-12-27 18:05 UTC
Requires
- php: >=8.1
- ext-json: *
- illuminate/contracts: >=8.0
Requires (Dev)
- orchestra/testbench: 6.0
- phpunit/phpunit: >=8.0
README
一个简单轻量级的 Laravel 数据传输对象 (DTO) 实现,支持可选的转换支持。
在底层,它实现了 Laravel 的 Castable
接口,并使用 Laravel 自定义转换,它处理在 DataTransferObject
(或兼容数组)与您的 JSON 数据库列之间的序列化。
安装
您可以通过 composer 安装此包
composer require tailflow/dto
使用方法
1. 创建您的 DataTransferObject
或 DataTransferObjectCollection
namespace App\DataTransferObjects; use Tailflow\DataTransferObjects\DataTransferObject; class Address extends DataTransferObject { public string $country; public string $city; public string $street; }
namespace App\DataTransferObjects; use Tailflow\DataTransferObjects\DataTransferObjectCollection; class WorkAddresses extends DataTransferObjectCollection { public static function getItemClass(): string { return Address::class; } }
(可选)2. 配置您的 Eloquent 属性转换
注意,这应该在您的数据库模式中的 jsonb
或 json
列中。
namespace App\Models; use App\DataTansferObjects\Address; use App\DataTansferObjects\WorkAddresses; use Illuminate\Database\Eloquent\Model; class User extends Model { protected $casts = [ 'address' => Address::class, 'work_addresses' => WorkAddresses::class, ]; }
3. 享受 ~
将 DTO 作为参数传递或用作返回值,并享受自动补全功能。
function getAddress(Address $originalAddress): Address { $address = new Address(); $address->county = $originalAddress->country; $address->city = 'Tokyo'; $address->street = '4-2-8 Shiba-koen'; return $address; } // or function getAddress(): Address { return new Address( [ 'country' => 'Japan', 'city' => 'Tokyo', 'street' => '4-2-8 Shiba-koen', ] ); }
在 Eloquent 模型上,您现在可以传递您的 Address
类的实例,甚至只是一个具有兼容结构的数组。它将自动在您的类和 JSON 之间进行转换以进行存储,并且数据将在进出过程中进行验证。
$workAddress = new Address(); $workAddress->country = 'Japan'; $workAddress->city = 'Osaka'; $user = User::create([ // ... 'address' => [ 'country' => 'Japan', 'city' => 'Tokyo', 'street' => '4-2-8 Shiba-koen', ], 'work_addresses' => [ $workAddress ] ]); $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;
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件。