ttbooking / data-mapper
将数据映射到类型化对象
0.0.12
2024-01-25 10:05 UTC
Requires
- php: ^8.1
Requires (Dev)
- phpunit/phpunit: ^10.0
README
- 从数据(数组、stdClass 或具有 toArray 方法的对象)填充对象。
- 基于属性工作。
- 简单类型转换。
- 可以使用转换器处理复杂类型。
- 属性可以有多个类型。
使用场景
<?php use DataMapper\Elements\DataMapper; /** * Описание структуры объекта */ class Example extends DataMapper { public string $property; } ... /** * Использование */ $item = Example::map(['property' => 'value']); echo $item->property; // value /** * Массив данных */ $items = Example::mapMany([ ['property' => 'value'], ['property' => 'value2'] ]);
内置属性
ManyOf
当数组中的每个元素都需要转换为类型时需要。接受简单类型或 Mappable。实际上执行 Caster 的角色,为了方便,已移至属性。
use DataMapper\Attributes\ManyOf; class Example extends DataMapper { #[ManyOf('int')] public array $values; } $item = Example::map(['values' => ['1', 3, '5', '0']]); /** * $item->values = [1, 3, 5, 0]; */
当指定类型为实现 Mappable 的类时,填充管理传递给它。
FromName & ToName
允许在填充时设置属性名称,以及在序列化为数组时的属性名称。
use DataMapper\Attributes\FromName; use DataMapper\Attributes\ManyOf; use DataMapper\Attributes\ToName; class Example extends DataMapper { #[ManyOf('int'), FromName('integers'), ToName('integerValues')] public array $values; } $item = Example::map(['integers' => ['1', 3, '5', '0']]); /** * $item->values === [1, 3, 5, 0]; * $item->toArray() === ['integerValues' => [1, 3, 5, 0]] */
IgnoresSerialization
允许在序列化时排除属性,在示例中不需要。
Caster
属性接受实现 InputCaster 或 OutputCaster 的类名。
DateTimeCaster
2 个参数
use DataMapper\Attributes\Caster; use DataMapper\Casters\DateTimeCaster; class Example extends DataMapper { // формат входящей даты, формат сериализации, часовой пояс #[Caster(DateTimeCaster::class, 'Y-m-d', 'd.m.Y', 'Europe/Kaliningrad')] public Carbon $date; } $example = Example::map([ 'date' => '20.11.2020' ]); $example->toJson(); // {"date": "2020-11-20"}
多种类型(联合类型)
优先考虑设置的第一个类型,然而在填充时从对象中取的类型与传递的对象的类型相匹配。
通常不需要创建属性,但此功能存在。创建转换器(Caster)通过实现相应的接口进行。
InputCaster 用于填充时转换数据。
OutputCaster 用于序列化时转换数据。
未来计划
- 添加传递 InputCaster 作为 ManyOf 或类似参数的功能,允许将转换应用于每个元素。