lemax10 / dto-helpers
DTO 辅助工具
v1.1.3
2024-06-22 10:07 UTC
Requires
- php: ^8.0.0
- laravel/framework: >=6.0
README
此集合提供了 DTO 类的辅助函数。
AsArray
将 DTO 转换为数组
类必须实现 Illuminate\Contracts\Support\Arrayable
<?php declare(strict_types=1); namespace Example/Dtos; use LeMaX10\DtoHelpers\Traits\AsArray; use Illuminate\Contracts\Support\Arrayable; class readonly ExampleArrayableDTO implements Arrayable { use AsArray; public function __construct( public string $key, public string $value ) {} } $dto = new ExampleArrayableDTO(key: 'test1', value: 'value1'); var_dump($dto->toArray()); // (array) ['key' => 'test1', 'value' => 'value1']
AsJson
将 DTO 转换为 JSON
类必须实现 Illuminate\Contracts\Support\Jsonable
<?php declare(strict_types=1); namespace Example/Dtos; use Illuminate\Contracts\Support\Jsonable; use LeMaX10\DtoHelpers\Traits\AsJson; use Illuminate\Contracts\Support\Arrayable; class readonly ExampleJsonableDTO implements Jsonable { use AsJson; public function __construct( public string $key, public string $value ) {} } $dto = new ExampleJsonableDTO(key: 'test1', value: 'value1'); var_dump($dto->toJson()); // (string) {key: "test1", value: "value1"}
AsJsonSerialize
类修改为 json_encode
类必须实现 JsonSerializable
<?php declare(strict_types=1); namespace Example/Dtos; use LeMaX10\DtoHelpers\Traits\AsJsonSerialize; use JsonSerializable; use Illuminate\Contracts\Support\Arrayable; class readonly ExampleJsonableDTO implements JsonSerializable { use AsJson; public function __construct( public string $key, public string $value ) {} } $dto = new ExampleJsonSerializeDTO(key: 'test1', value: 'value1'); var_dump(json_encode($dto)); // (string) {key: "test1", value: "value1"}
AsCloneable
类修改为 json_encode
类必须实现 Arrayable
<?php declare(strict_types=1); namespace Example/Dtos; use LeMaX10\DtoHelpers\Traits\AsArray; use LeMaX10\DtoHelpers\Traits\AsCloneable; use Illuminate\Contracts\Support\Arrayable; class readonly ExampleCloneableDTO implements Arrayable { use AsArray, AsCloneable; public function __construct( public string $key, public string $value ) {} } $dto = new ExampleCloneableDTO(key: 'test1', value: 'value1'); var_dump($dto->toArray()); // (array) ["key" => "test1", "value" => "value1"] $clone = $dto->clone(['key' => 'test2']); var_dump($dto->toArray()); // (array) ["key" => "test2", "value" => "value1"]
Laravel Eloquent 模型转换
Laravel AsDto 转换
<?php declare(strict_types=1); namespace App/Models; use LeMaX10\DtoHelpers\Casts\AsDto; use ExampleDto; class ExampleModel extends Model { .... public $casts = [ 'dto' => AsDto::class .':'. ExampleDto::class, ]; } $model = ExampleModel::find(1); var_dump($model->dto); // (object) ExampleDto
其他示例
<?php declare(strict_types=1); namespace Example/Dtos; use LeMaX10\DtoHelpers\Traits\AsJsonSerialize; use LeMaX10\DtoHelpers\Traits\AsArray; use LeMaX10\DtoHelpers\Traits\AsJson; use JsonSerializable; use Illuminate\Contracts\Support\Arrayable; use Illuminate\Contracts\Support\Jsonable; class readonly ExampleJsonableDTO implements Arrayable, Jsonable, JsonSerializable { use AsArray, AsJson, AsJsonSerialize, AsCloneable; public function __construct( public string $key, public string $value ) {} } $dto = new ExampleJsonSerializeDTO(key: 'test1', value: 'value1'); var_dump($dto->toArray()); // (array) ['key' => 'test1', 'value' => 'value1'] var_dump($dto->toJson()); // (string) {key: "test1", value: "value1"} var_dump(json_encode($dto)); // (string) {key: "test1", value: "value1"} $clone = $dto->clone(['key' => 'test2']); var_dump($dto->toArray()); // (array) ['key' => 'test2', 'value' => 'value1']