horizom / dto
所有PHP应用程序的数据传输对象
5.1.0
2024-03-09 23:03 UTC
Requires
- php: ^7.0||^8.0
README
Horizom DTO
所有PHP应用程序的数据传输对象。
数据传输对象(DTO)是在系统之间传输数据的对象。DTO通常用于应用程序中,为应用程序的不同部分之间(如用户界面和业务逻辑之间)传输数据提供简单、一致的数据格式。
安装
composer require horizom/dto
使用方法
定义DTO属性
use Horizom\DTO\DTO; class UserDTO extends DTO { public string $name; public string $email; public string $password; }
创建DTO实例
您可以通过多种方式创建一个DTO
实例
从数组
$dto = new UserDTO([ 'name' => 'John Doe', 'email' => 'john.doe@example.com', 'password' => 's3CreT!@1a2B' ]);
您还可以使用fromArray
静态方法
$dto = UserDTO::fromArray([ 'name' => 'John Doe', 'email' => 'john.doe@example.com', 'password' => 's3CreT!@1a2B' ]);
从JSON字符串
$dto = UserDTO::fromJson('{"name": "John Doe", "email": "john.doe@example.com", "password": "s3CreT!@1a2B"}');
访问DTO数据
创建您的DTO
实例后,您可以像访问一个object
一样访问任何属性
$dto = new UserDTO([ 'name' => 'John Doe', 'email' => 'john.doe@example.com', 'password' => 's3CreT!@1a2B' ]); $dto->name; // 'John Doe' $dto->email; // 'john.doe@example.com' $dto->password; // 's3CreT!@1a2B'
转换DTO属性
您可以将您的DTO
属性转换到某些类型
use App\Enums\UserRole; use Carbon\Carbon; use Horizom\DTO\DTO; use DateTimeImmutable; use Horizom\DTO\Casting\ArrayCast; use Horizom\DTO\Casting\EnumCast; class UserDTO extends DTO { public string $id; public string $name; public string $email; public string $password; public Carbon $created_at; public DateTimeImmutable $updated_at; public array $roles; protected function casts() { return [ 'id' => 'integer', 'name' => 'string', 'email' => 'string', 'password' => 'string', 'created_at' => Carbon::class, 'updated_at' => DateTimeImmutable::class, 'admin_role' => UserRole::class, 'roles' => new ArrayCast(new EnumCast(UserRole::class)), ]; } }
定义默认值
有时我们可以有可选属性,并且可以具有默认值。您可以在defaults
函数中为您的DTO
属性定义默认值
use Horizom\DTO\DTO; use Illuminate\Support\Str; class UserDTO extends DTO { // ... protected function defaults() { return [ 'username' => Str::slug($this->name), ]; } }
使用上面的DTO
定义,您可以运行
$dto = new UserDTO([ 'name' => 'John Doe', 'email' => 'john.doe@example.com', 'password' => 's3CreT!@1a2B' ]); $dto->username; // 'john_doe'
转换DTO数据
您可以将您的DTO转换为某些格式
转换为数组
$dto = new UserDTO([ 'name' => 'John Doe', 'email' => 'john.doe@example.com', 'password' => 's3CreT!@1a2B', ]); $dto->toArray(); // [ // "name" => "John Doe", // "email" => "john.doe@example.com", // "password" => "s3CreT!@1a2B", // ]
转换为JSON字符串
$dto = new UserDTO([ 'name' => 'John Doe', 'email' => 'john.doe@example.com', 'password' => 's3CreT!@1a2B', ]); $dto->toJson(); // '{"name":"John Doe","email":"john.doe@example.com","password":"s3CreT!@1a2B"}'
创建您自己的类型转换
可转换类
您可以通过实现Horizom\DTO\Contracts\CastableContract
接口轻松地为您的项目创建新的Castable
类型。此接口有一个必须实现的方法
public function cast(string $property, mixed $value): mixed;
假设您有一个URLWrapper
类在您的项目中,并且您希望当将URL传递到您的DTO
时,它始终返回一个URLWrapper
实例而不是一个简单的字符串
use Horizom\DTO\Contracts\CastableContract; class URLCast implements CastableContract { public function cast(string $property, mixed $value): URLWrapper { return new URLWrapper($value); } }
然后您可以将此应用到您的DTO上
use Horizom\DTO\DTO; class CustomDTO extends DTO { protected function casts() { return [ 'url' => new URLCast(), ]; } protected function defaults() { return []; } }
可调用转换
您还可以通过使用可调用/回调来为您的项目创建新的Castable
类型
use Horizom\DTO\DTO; class CustomDTO extends DTO { protected function casts(): array { return [ 'url' => function (string $property, mixed $value) { return new URLWrapper($value); }, ]; } protected function defaults(): array { return []; } }
或者您可以使用静态方法
use Horizom\DTO\Casting\Cast; use Horizom\DTO\DTO; class CustomDTO extends DTO { protected function casts() { return [ 'url' => Cast::make( function (string $property, mixed $value) { return new URLWrapper($value); }, function (string $property, URLWrapper $value) { return $value->toString(); } ) ]; } protected function defaults() { return []; } }
使用Laravel扩展的可能性
您可以通过扩展DTO
类来创建自己的DTO
类,并添加一些自定义方法
use App\Http\Resources\UserResource; use Horizom\DTO\DTO; use Illuminate\Database\Eloquent\Model; class UserDTO extends DTO { public int $id; public string $name; public string $email; public string $password; public Carbon $created_at; public CarbonImmutable $updated_at; public DateTimeImmutable $verified_at; public static function fromModel(Model $model) { return new self($model->toArray()); } public function toModel() { return new Model($this->toArray()); } public function toResource() { return new UserResource($this->toArray()); } protected function casts() { return [ 'id' => 'integer', 'name' => 'string', 'email' => 'string', 'password' => 'string', 'created_at' => Carbon::class, 'updated_at' => CarbonImmutable::class, 'verified_at' => DateTimeImmutable::class, ]; } }
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。