#DataMapper
DataMapper помогает вам преобразовать один формат данные в другой, вы можете получить как массив данных, так и XML.
Установка с помощью Composer
composer require dvasilenko/datamapper_toolsНеобходимо создать класс описывающий правила преобразования данных, отнаследовавшись от базавого класса BaseDataMapper.
Базово поддерживается 4 типа данных:
- Дата и время
- Константа
- Справочник
- Простой тип
При необходимости можно расширить своими типами данных.
use DataMapper\Tools\BaseDataMapper;
class MyDataMapper extends BaseDataMapper
{
protected $rules = [
'ruleCode' => [],
];
}Обращение к элементам вложенного массива осуществляется через точку "."
Например, правила ниже позволяют обратиться к значениям элемента "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]);
}
}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']