alexpts / php-data-transformer
Requires
- php: ^7.1
- symfony/yaml: ^3.2.
Requires (Dev)
- phpunit/phpunit: ^6.0
This package is auto-updated.
Last update: 2020-06-09 19:42:22 UTC
README
仓库已废弃 2019-12-31
此仓库已迁移至 alexpts/php-data-transformer2。
更新且更灵活的库版本 - https://github.com/alexpts/php-data-transformer2
需要以不同形式呈现相同的数据。在代码中,处理高层模型很方便。但通常需要将这些数据转换为更简单的形式,通常是关联数组,以便将其保存在数据库中。在应用程序之间传输数据时,通常使用简单的DTO实体。
该组件允许您轻松地将数据转换为关联数组,反之亦然。
所有映射方案都是声明性地定义的,且在模型之外。这允许为同一模型定义不同的映射方案和字段转换。例如,在保存到MongoDB之前,可以将类型为DateTime
的字段转换为MongoDate
或UTCDateTime
对象。在向客户端返回之前,可以将其转换为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 应该以非字符串类型表示(例如 MongoId
或 ObjectId
),则只需描述自己的类型。
连接自定义类型
创建自己的类型转换,包含 toData
和 toModel
方法。通过 addType($name, $type)
方法将新类型连接到 TypeConverter
对象。使用此方法,可以替换标准类型,用自定义实现替代。
可以从 TypeConverter 类继承,并在构造函数中指定所有默认类型,以避免手动连接类型。