dvasilenko / datamapper_tools
有用的DataMapper工具
1.0.1
2021-02-07 20:45 UTC
Requires
- php: >=7.2
- nesbot/carbon: *
- phpunit/phpunit: *
This package is auto-updated.
Last update: 2024-09-08 04:48:42 UTC
README
#DataMapper
DataMapper帮助您将一种数据格式转换为另一种格式,您可以得到数组数据或XML。
内容
安装
使用Composer安装
composer require dvasilenko/datamapper_tools
使用
需要创建一个描述转换规则的数据类,通过继承基础类BaseDataMapper。
基础支持4种数据类型
- 日期和时间
- 常量
- 字典
- 简单类型
需要时可以扩展自己的数据类型。
创建自己的DataMapper
use DataMapper\Tools\BaseDataMapper; class MyDataMapper extends BaseDataMapper { protected $rules = [ 'ruleCode' => [], ]; }
配置自己的DataMapper
通过点"."访问嵌套数组的元素
例如,以下规则允许访问"client"和"order"元素的值
/** * Если необходимо проверить на XSD, привязка к ключу правила, значение путь к xsd файлу * @var array */ protected $xsd = [ //'ruleCode' => '', ]; /** * Корневой XML документ * @var string */ protected $xml = '<?xml version="1.0" encoding="UTF-8"?><Items xmlns="http://www.datapump.cig.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.datapump.cig.com"></Items>'; /** * Если необходимо задать корневому узлу параметр xmlns, для данных в XML * @var */ protected $targetNamespace; /** * Правила маппинга (пример использования разных обработчиков данных) * @var array */ protected $rules = [ 'clientOrder' => [ ['type' => 'Define', 'value' => '1', 'field' => 'Client.Type', 'params' => ['attribute' => 'id']], ['type' => 'Simple', 'key' => 'client.id', 'field' => 'Client.Id'], ['type' => 'Simple', 'key' => 'client.name', 'field' => 'Client.Name'], ['type' => 'MyNameSpace\\DataMapper\\Resolve\\Fio', 'field' => 'Client.FIO', 'params' => ['name' => 'client.name', 'lastName' => 'client.lastName']], ['type' => 'DateTime', 'key' => 'client.dateBirth', 'field' => 'Client.DateBirth', 'params' => ['format' => 'd.m.Y']], [ 'type' => 'Directory', 'key' => 'client.gender', 'field' => 'Client.Gender', 'params' => [ 'conformity' => [ 'man' => 'M', 'woman' => 'F', ], ], ], ['type' => 'Simple', 'key' => 'order.id', 'field' => 'Client.Order.Id'], ], ];
创建自己的数据类型处理器
处理器类必须实现ResolveInterface接口
use DataMapper\Tools\Contracts\ResolveInterface, DataMapper\Tools\Resolve\Base; class Fio extends Base implements ResolveInterface { public static function run(array $val, array $data) { $name = self::getValByKey($val['params']['name'], $data); $lastName = self::getValByKey($val['params']['lastName'], $data); return implode(' ', [$lastName, $name]); } }
使用DataMapper
use MyDataMapper; $data = [ 'client' => [ 'id' => 1, 'name' => 'Имя', 'lastName' => 'Фамилия', 'dateBirth' => '2000-01-01', 'gender' => 'man', ], 'order' => [ 'id' => 1, ], ]; $uploadData = [ 'client' => $clientData, 'order' => $orderData, ]; $dataMapper = new MyDataMapper; // Если нужен массив данных $data = $dataMapper->getData('clientOrder', $uploadData);
结果
Array
(
[Client] => Array
(
[Type] => Array
(
[attributes] => Array
(
[id] => 1
)
)
[Id] => 1
[Name] => Имя
[FIO] => Фамилия Имя
[DateBirth] => 01.01.2000
[Gender] => M
[Order] => Array
(
[Id] => 1
)
)
)
如果需要XML
$data = $dataMapper->getXmlString('clientOrders', $uploadData);
结果
<?xml version="1.0" encoding="UTF-8"?> <Items xmlns="http://www.datapump.cig.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.datapump.cig.com"> <Client> <Type id="1"/> <Id>1</Id> <Name>Имя</Name> <FIO>Фамилия Имя</FIO> <DateBirth>01.01.2000</DateBirth> <Gender>M</Gender> <Order> <Id>1</Id> </Order> </Client> </Items>
默认数据处理器
基础支持4种数据类型
需要指定时间格式(支持DateTime类的时间格式)。如果值以数值形式传递,则认为是Timestamp,也可以指定值以毫秒为单位传递
'type' => 'DateTime', 'key' => '', 'field' => '', 'params' => ['format' => 'd.m.Y', 'isMillisecond' => true]
可以指定值作为参数的属性部分传递
'type' => 'Define', 'key' => '', 'field' => '', params => ['attribute' => 'id']
以下列出了一些选项,允许它们组合使用。
如果需要指定具有数值范围匹配条件的数组对应关系
'type' => 'Directory', 'key' => '', 'field' => '', params => [
'conformityCondition' => [
['from' => 1, 'to' => 30, 'value' => 1],
['from' => 31, 'to' => 60, 'value' => 2],
['from' => 61, 'to' => 90, 'value' => 3],
['from' => 91, 'to' => 180, 'value' => 4],
['from' => 181, 'to' => 365, 'value' => 5],
['from' => 366, 'to' => 1095, 'value' => 6],
['from' => 1096, 'value' => 7],
['value' => 8],
]
]
简单数组对应关系
'type' => 'Directory', 'key' => '', 'field' => '', 'params' => [
'conformity' => [
'man' => 'M',
'woman' => 'F',
],
'default' => 'M',
],
如果需要预先转换为数值类型(int)
type='Directory', 'key' => '', 'field' => '', 'params' => ['type' => 'int']
如果需要根据额外字段进行过滤
type='Directory', 'key' => '', 'field' => '', 'params' => [
'propertyCode' => '',// код поля, содержащим массив доп. полей
'propertyId' => '',// наименование нужного поля
'propertyRowId' => '',// атрибут хранящий значение
],
可以指定值作为参数的属性部分传递
'type' => 'Directory', 'key' => '', 'field' => '', 'params' => ['attribute' => 'id']
可以在"funcs"键中指定要处理获取值的函数
'type' => 'Simple', 'key' => '', 'field' => '', 'funcs' => 'trim|mb_strtoupper'
可以指定值作为参数的属性部分传递
type='Simple', key='' field='' params=['attribute' => 'id']