jamie_sharief / data-transfer-object
数据传输对象 (DTO)
0.1.2
2021-02-05 00:23 UTC
Requires
- php: >=7.4.0
Requires (Dev)
- phpstan/phpstan: ^0.12.64
- phpunit/phpunit: ^9.2
README
创建
要创建一个 DataTransferObject
,创建类并使用公共属性。
use DataTransferObject\DataTransferObject; class Employee extends DataTransferObject { public string $name; public string $email; public ?Employee $reportsTo; public int $age; public bool $active = true; /** * @var \App\DataTransferObject\Employee[] $subordinates */ public array $subordinates = []; }
然后设置数据
$employee = new Employee(); $employee->name = 'sarah';
在构造参数时,您还可以使用数组批量设置属性。注意,这仅设置,不转换或提取,请参阅 fromArray
$sarah = new Employee([ 'name' => 'Sarah', 'email' => 'sarah@example.com', 'reportsTo' => $claire ]);
构建
当您使用 DataTransferObject
构造函数时,它简单地设置您提供的值,但是当您需要转换数据和类型时,您可以使用 fromArray
方法。
fromArray
提取相关数据,并且它
- 将内置类型 bool、int、string、float 等
- 将创建一个
DataTransferObject
、DateTime
或任何具有__set_state
魔术方法的其它对象。
它将只提取 DataTransferObject
中定义的字段,并且如果提取数据后 DataTransferObject
上的属性未初始化,则将抛出错误。
例如,相关的 DataTransferObjects
,如 belongsTo
和 hasMany
将被打包。为了使 hasMany
工作正常,创建一个数组并设置如下 DocBlock 定义:
class Employee extends DataTransferObject { public string $name; public string $email; public ?Employee $reportsTo; /** * @var \App\DataTransferObjects\Employee[] $subordinates */ public array $subordinates = []; }
使用 fromArray
方法
$employee = Employee::fromArray([ 'name' => 'Sarah', 'email' => 'sarah@example.com', 'reportsTo' => [ 'name' => 'Claire', 'email' => 'claire@example.com', ], 'subordinates' => [ [ 'name' => 'Jon', 'email' => 'jon@example.com' ] ] ]);
转换为数组
如果对象具有 toArray
方法或没有 __toString
方法,则将 DataTransferObject
和任何 嵌套 对象转换为数组。
$employee->toArray();
序列化/反序列化
默认序列化方法是 JSON,对于不同的方法,例如 XML,您可以重写 serialize
和 deserialize
方法。只有公共属性将在序列化和反序列化过程中使用。
转换为字符串
将 DataTransferObject
转换为字符串。
$employee->toString();
从字符串
将字符串转换为 DataTransferObject
$employee = Contact::fromString( '{"name":"Jon","company":"Snow Enterprises","email":"jon@example.com","age":33,"unsubscribed":false}' );
初始化钩子
当 DataTransferObject
被构造时,如果它可用,将调用 initialize
方法,这是一个钩子,以防您需要重写构造函数。
异常处理
如果您尝试设置或获取一个不存在的属性,将抛出 RuntimeException
。