dvasilenko/datamapper_tools

有用的DataMapper工具

1.0.1 2021-02-07 20:45 UTC

This package is auto-updated.

Last update: 2024-09-08 04:48:42 UTC


README

#DataMapper

DataMapper帮助您将一种数据格式转换为另一种格式,您可以得到数组数据或XML。

Latest Stable Version Total Downloads Latest Unstable Version License

内容

  1. 安装
  2. 使用
    1. 创建自己的DataMapper
    2. 配置自己的DataMapper
    3. 创建自己的数据类型处理器
    4. 使用DataMapper
  3. 默认数据处理器
    1. 日期和时间
    2. 常量
    3. 字典
    4. 简单

安装

使用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']