https://github.com/alexpts/php-hydrator
Allows extracting dto from objects and getting objects from dto
https://github.com/alexpts/php-hydrator
data-mapper dto hydrator mapper translation
Last synced: 7 months ago
JSON representation
Allows extracting dto from objects and getting objects from dto
- Host: GitHub
- URL: https://github.com/alexpts/php-hydrator
- Owner: alexpts
- Created: 2017-06-12T18:37:25.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2023-04-06T19:34:20.000Z (almost 3 years ago)
- Last Synced: 2025-06-02T16:16:08.738Z (8 months ago)
- Topics: data-mapper, dto, hydrator, mapper, translation
- Language: PHP
- Homepage:
- Size: 96.7 KB
- Stars: 11
- Watchers: 1
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# php-hydrator
[](https://github.com/alexpts/php-hydrator/actions/workflows/phpunit.yml)
[](https://codecov.io/gh/alexpts/php-hydrator)
Одни и те же данные нужно представить в разном виде. В коде удобно работать с высокоуровневыми моделями. Но для сохранения этих данных в базу данных, как правило, данные требуется перевести в более простой вид, обычно в ассоциативный массив. Для передачи данных между приложениями используют простые DTO сущности.
Компонент позволяет легко конвертировать ваши данные в ассоциативный массив из модели и обратно заполнять вашу модель данными.
### Extractor
Задача класса Extractor извлечь из вашей модели данные согласно указанынм правилам.
```php
$extractor = new Extractor;
$normalizer = new \PTS\Hydrator\Normalizer;
$model = new Model([
'id' => 1,
'name' => 'Alex'
'email' => 'some@web.dev'
]);
$rules = [
'id' => [], // prop as dto`s key
'name' => [
'prop' => 'name', // prop is name field in model
],
'email' => [
'get' => 'getEmail', // getter $model->getEmail();
]
];
$rules = $normalizer->normalize($rules);
$extractor->extract($model, $rules)
```
Правила извлечения данных описываются в виде ассоциативного массива, где ключ массива это имя ключа в DTO сущности.
Наприимер поле модели name можно замапить в поле с именем login в DTO сущности таким образом.
```php
$rules = [
'login' => [
'prop' => 'name',
],
...
];
$extractor->extract($model, $rules);
```
Извлечение через prop позволяет извлеч из модели поле с любой областью видимости (public/protect/private).
Если значение prop не указано явно, то оно равно имени ключа DTO сущности. В следующем примере это будет значение name.
```php
$rules = [
'name' => [],
...
];
$rules = $normalizer->normalize($rules);
$extractor->extract($model, $rules)
```
Помимо извлечения данных свойств из модели, данные можно получить через вызов метода модели (getter).
```php
$rules = [
'name' => [
'get' => 'getName', // getter $model->getName();
],
];
$extractor->extract($model, $rules);
```
Геттер имеит более высокий приоритет, чем свойтво prop.
### Hydrator
Класс Hydrator позволяет наполнить модель данными.
```php
$hydrator = new Hydrator;
$dto = [
'id' => 1,
'login' => 'Alex'
'email' => 'some@web.dev
];
$rules = [
'id' => [], // prop as dto`s key
'login' => [
'prop' => 'name', // dto key login fill property name
],
'email' => [
'set' => 'setEmail', // setter $model->setEmail();
]
];
$rules = $normalizer->normalize($rules);
$model = $hydrator->hydrate($dto, Model::class, $rules);
$model2 = new Model;
$hydrator->hydrateModel($dto, $model2, $rules);
```
Правила гидрации точно такие же как и у extractor сущности.
### HydratorService
Класс HydratorService является совмещает в себе Hydrator и Extractor.
Также он требует правил в виде сущности Rules, которая сглаживает правил и позволяет описывать их более лаконично
```php
$hydratorService = new HydratorService;
$rules = [
'id' => [], // prop as dto`s key
'login' => [
'prop' => 'name', // dto key login fill property name
],
'email' => [
'set' => 'setEmail', // setter $model->setEmail();
]
];
$rules = $normalizer->normalize($rules);
$dto = $hydratorService->extract($model, $rules);
$model = $hydratorService->hydrate($dto, Model::class, $rules);
```
### Больше возможностей
Если требуется рекурсивная гидрация/извлечение зависимостей, требуется декларативно объявлять правила трансформации,
вызывать pipe функции для фильтрации значения, то стоит воспользоваться надсткойкой над этой билбиотекой - https://github.com/alexpts/php-data-transformer2