PHPackages                             alexpts/php-data-transformer2 - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Parsing &amp; Serialization](/categories/parsing)
4. /
5. alexpts/php-data-transformer2

ActiveLibrary[Parsing &amp; Serialization](/categories/parsing)

alexpts/php-data-transformer2
=============================

Convert model to dto, convert dto to model

6.1.2(3y ago)12243[3 issues](https://github.com/alexpts/php-data-transformer2/issues)[1 PRs](https://github.com/alexpts/php-data-transformer2/pulls)1MITPHPPHP &gt;=8.1CI failing

Since Jun 17Pushed 5mo ago2 watchersCompare

[ Source](https://github.com/alexpts/php-data-transformer2)[ Packagist](https://packagist.org/packages/alexpts/php-data-transformer2)[ Docs](https://github.com/alexpts/php-data-transformer2)[ RSS](/packages/alexpts-php-data-transformer2/feed)WikiDiscussions master Synced 4w ago

READMEChangelog (10)Dependencies (4)Versions (22)Used By (1)

php-data-transformer2
=====================

[](#php-data-transformer2)

[![phpunit](https://github.com/alexpts/php-data-transformer2/actions/workflows/phpunit.yml/badge.svg?branch=master)](https://github.com/alexpts/php-data-transformer2/actions/workflows/phpunit.yml)[![codecov](https://camo.githubusercontent.com/cc71355357073c0baeefc1cfcc794abe36900aaf1c17413408c37b607dc1e246/68747470733a2f2f636f6465636f762e696f2f67682f616c65787074732f7068702d646174612d7472616e73666f726d6572322f6272616e63682f6d61737465722f67726170682f62616467652e7376673f746f6b656e3d31344c36494a41355545)](https://codecov.io/gh/alexpts/php-data-transformer2)

Позволяет извлекать данные из объектов и создавать объекты из данных. Позволяет делать это по заранее опрелделенной схеме в обе стороны. Например извлечь данные из Model для записи в БД. Либо создать/заполнить Model данными из БД.

### Install

[](#install)

`composer require alexpts/php-data-transformer2`

Библиотека представляет собой более высокий уровень билбиотеки . Расширяя ее возможности и упрощая работу за счет:

- Декларативного описания правил преобразования
- Рекурсивного преобразования вложенных моделей и коллекций моделей
- Более лаконичного синтаксиса

Базовые правила схем трансформации подробно описаны в проекте .

### Data Transformer

[](#data-transformer)

Класс DataTransformer является более высокоуровневым. Он позволяет работать с HydratorService и описывать схемы преобразования для каждого класса отдельно.

Для одного класса может быть множество схем преобразования. Для преобразования модели для сохранения в БД требуется преобразовать ее в DTO сущность (массив php). При этом все значения типа \\DateTime преобразовать в timestamp (integer тип). Если мы передаем эту же модель на клиент через REST API, то схема преобразования может быть иной. Все значения \\DateTime нужно представить в виде строки в формате ISO8601.

```
use PTS\DataTransformer\DataTransformer;

$dataTransformer = new DataTransformer;
$dataTransformer->getMapsManager()->setMapDir(UserModel::class, __DIR__ . '/data');

$model = $dataTransformer->toModel(UserModel::class, [
    'id' => 1,
    'creAt' => new DateTime,
    'name' => 'Alex',
    'active' => 1,
]);

$dto = $dataTransformer->toDTO($model, 'dto');
$dtoForDb = $dataTransformer->toDTO($model, 'db');
```

### Вариации представлений

[](#вариации-представлений)

Может потребоваться для разных сценариев извлекать данные по разным правиоам из модели. Либо может быть просто более компактное представлеиние этой же модели, без лишних деталей. Можно использовать несколько схем для 1 модели, например `short.dto`:

```
$shortFormatDto = $dataTransformer->toDTO($model, 'short.dto');
```

Также можно исключить часть полей, без необъодимости определять новую схему/map для преобразования, указав при вызовы опцию `excludeFields` с массивом игнорируемых полей в схеме:

```
$shortFormatDto = $dataTransformer->toDTO($model, 'dto', [
     'excludeFields' => ['password']
]);
```

### Коллекция моделей

[](#коллекция-моделей)

Небольшой сахар, чтобы перевести коллекцию однотипных моделей в коллекцию DTO:

```
$mapName = 'dto';
$excludedFields = ['name'];
$dtoCollection = $dataTransformer->toDtoCollection($models, $mapName);
```

### Вложенные модели

[](#вложенные-модели)

Если свойство модели представлено другой моделью или коллекцией моделей, то можно рекурсивно извлечь/заполнить модель. Для этого в схеме маппинга нужно использовать ключ `ref`.

```
// map file deepDto.php
return [
    'id' => [],
    'creAt' => [],
    'name' => [],
    'login' => [],
    'active' => [
        'pipe-populate' => ['boolval'],
        'pipe-extract' => ['boolval'],
    ],
    'email' => [
        'pipe-populate' => [ // any callable
            'strval',
            'strtolower',
         ]
    ],
    'refModel' => [
        'ref' => [
            'model' => UserModel::class,
            'map' => 'dto'
        ]
    ],
    'refModels' => [
        'ref' => [
            'model' => UserModel::class,
            'map' => 'dto',
            'collection' => true
        ]
    ],
];

// code file
$model = $dataTransformer->toModel(UserModel::class, [
    'id' => 1,
    'creAt' => new DateTime,
    'name' => 'Alex',
    'active' => 1,
    'refModel' => [
        'id' => 2,
        'name' => 'refModel',
    ]
], 'deepDto');

$model2 = $dataTransformer->toModel(UserModel::class, [
    'id' => 1,
    'creAt' => new DateTime,
    'name' => 'Alex',
    'active' => 1,
    'refModels' => [ // collection ref models
        [
            'id' => 2,
            'name' => 'refModel',
        ],
        [
            'id' => 2,
            'name' => 'refModel',
        ]
    ]
], 'deepDto');
```

### Логика в pipe обработчиках

[](#логика-в-pipe-обработчиках)

Обработчики pipe позволяют описывать callable методы и писать любую логику, которая будет применяться к значению. В pipe обработчиках можно кастить типы. Либо шифровать поля перед записью в БД. В случае необходимости, чтобы вся логика маппинга была в 1 месте, вы может прокинуть любые зависимости через замыкание в функцию pipe, достав их из контейнера `$this->getContainer()`.

```
