alexpts/php-data-transformer

该软件包已废弃,不再维护。作者建议使用alexpts/php-data-transformer2软件包。

将模型转换为数据及其反向转换

dev-master 2020-06-09 19:41 UTC

This package is auto-updated.

Last update: 2020-06-09 19:42:22 UTC


README

仓库已废弃 2019-12-31

此仓库已迁移至 alexpts/php-data-transformer2

SensioLabsInsight

Build Status Test Coverage Code Climate Scrutinizer Code Quality

更新且更灵活的库版本 - https://github.com/alexpts/php-data-transformer2

需要以不同形式呈现相同的数据。在代码中,处理高层模型很方便。但通常需要将这些数据转换为更简单的形式,通常是关联数组,以便将其保存在数据库中。在应用程序之间传输数据时,通常使用简单的DTO实体。

该组件允许您轻松地将数据转换为关联数组,反之亦然。

所有映射方案都是声明性地定义的,且在模型之外。这允许为同一模型定义不同的映射方案和字段转换。例如,在保存到MongoDB之前,可以将类型为DateTime的字段转换为MongoDateUTCDateTime对象。在向客户端返回之前,可以将其转换为ISO8601字符串。在保存到Redis之前,可以将其转换为timestamp

来自浏览器表单的数据始终具有字符串数据类型,无论是数字还是true/false。转换器解决这个问题,在模型中,数据始终被转换为映射转换图中指定的类型。

安装

$ composer require alexpts/php-data-transformer

要求

PHP 7.0+

模型

转换器不会限制您的模型。您将使用纯净的模型。

转换器

在将模型转换为数组或将数组转换为模型时,每个字段都会通过转换器映射表中的特定类型。转换器映射表是一个类似yml的文件,如下所示

id:
    type: int
    get: getId
login:
    type: string
    get: getLogin
    set: setLogin
name:
    type: string
    prop: name
active:
    type: bool
    prop: active
creAt:
    type: date
    get: getCreAt
email:
    type: string
    prop: email
postsIds:
	type: int
	coll: true
roles:
    type: refModels
    prop: roles
    rel:
        model: \\SomeNamespace\\Role
        map: dto

其中键是数组索引。

type - 转换器类型

coll - [可选] 布尔值,表示值是否是集合

prop - [可选] 模型属性

get - [可选] 模型的getter方法(忽略prop

set - [可选] 模型的setter方法(忽略prop

rel - [可选] 描述相关模型的对象

rel.model - [可选] 相关模型的完整字符串路径类

rel.map - [可选] 内嵌模型的转换器映射表名称 [默认: 'dto']

转换器映射管理器

使用MapsManager对象的方法setMapDir来注册转换器映射表。第一个参数是模型类。第二个参数是该模型转换器映射表的目录。

$mapsManager = new MapsManager(new Parser);
$mapsManager = setMapDir(UserModel::class, __DIR__ . '/transformers');

模型到DTO

$transformer = new DataTransformer(
	new TypeConverter,
	$mapsManager,
	new ModelClosure
);

模型通过第一个参数传递给转换器的 getData 方法。第二个参数指定该模型的转换图名称(默认为 dto)。

$user = new User('name', 'login', 'email@gmail.com');
$dtoUser = $transformer->getData($user, 'dto');

在这个例子中,转换文件的路径将如下所示

__DIR__ . '/transformers/dto.yml'.

数据转换为模型

通过同一转换图,数据可以被逆向转换回模型。

$data = [
	'name' => 'name',
	'login' => 'login',
	'email' => 'email@gmail.com'
];

$model = $transformer->createModel(User::class);
$transformer->fillModel($data, $model, 'dto');

值作为集合

如果模型字段表示某种值的集合,则可以通过类型转换遍历集合中的每个值,并获取转换后的值集合。为此,在转换图中指定字段的标志 coll: true。同样,可以编写自己的类型转换,自行决定如何处理值集合。

嵌套模型

您可以定义嵌套模型的转换类型。嵌套集合模型的转换示例是类型 refModels示例:使用数组嵌套模型的模型转换

通常,传递或存储嵌套模型的 id 而不是整个模型是合理的。这种转换的类型示例是 refModelsToArrayStringId。如果模型 id 应该以非字符串类型表示(例如 MongoIdObjectId),则只需描述自己的类型。

连接自定义类型

创建自己的类型转换,包含 toDatatoModel 方法。通过 addType($name, $type) 方法将新类型连接到 TypeConverter 对象。使用此方法,可以替换标准类型,用自定义实现替代。

可以从 TypeConverter 类继承,并在构造函数中指定所有默认类型,以避免手动连接类型。