ttbooking/data-mapper

将数据映射到类型化对象

0.0.12 2024-01-25 10:05 UTC

This package is auto-updated.

Last update: 2024-09-25 11:57:17 UTC


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 或类似参数的功能,允许将转换应用于每个元素。