PHPackages                             alexpts/php-hydrator - 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. [Localization &amp; i18n](/categories/localization)
4. /
5. alexpts/php-hydrator

ActiveLibrary[Localization &amp; i18n](/categories/localization)

alexpts/php-hydrator
====================

Convert model to dto, convert dto to model

5.0.2(3y ago)114551[2 PRs](https://github.com/alexpts/php-hydrator/pulls)1MITPHPPHP &gt;=8.1CI failing

Since Jun 17Pushed 3mo ago1 watchersCompare

[ Source](https://github.com/alexpts/php-hydrator)[ Packagist](https://packagist.org/packages/alexpts/php-hydrator)[ Docs](https://github.com/alexpts/php-hydrator)[ RSS](/packages/alexpts-php-hydrator/feed)WikiDiscussions master Synced 3d ago

READMEChangelog (10)Dependencies (2)Versions (13)Used By (1)

php-hydrator
============

[](#php-hydrator)

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

Одни и те же данные нужно представить в разном виде. В коде удобно работать с высокоуровневыми моделями. Но для сохранения этих данных в базу данных, как правило, данные требуется перевести в более простой вид, обычно в ассоциативный массив. Для передачи данных между приложениями используют простые DTO сущности.

Компонент позволяет легко конвертировать ваши данные в ассоциативный массив из модели и обратно заполнять вашу модель данными.

### Extractor

[](#extractor)

Задача класса Extractor извлечь из вашей модели данные согласно указанынм правилам.

```
$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 сущности таким образом.

```
$rules = [
   'login' => [
	   'prop' => 'name',
   ],
   ...
];
$extractor->extract($model, $rules);
```

Извлечение через prop позволяет извлеч из модели поле с любой областью видимости (public/protect/private). Если значение prop не указано явно, то оно равно имени ключа DTO сущности. В следующем примере это будет значение name.

```
$rules = [
   'name' => [],
   ...
];
$rules = $normalizer->normalize($rules);

$extractor->extract($model, $rules)
```

Помимо извлечения данных свойств из модели, данные можно получить через вызов метода модели (getter).

```
$rules = [
   'name' => [
	   'get' => 'getName', // getter $model->getName();
   ],
];

$extractor->extract($model, $rules);
```

Геттер имеит более высокий приоритет, чем свойтво prop.

### Hydrator

[](#hydrator)

Класс Hydrator позволяет наполнить модель данными.

```
$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)

Класс HydratorService является совмещает в себе Hydrator и Extractor. Также он требует правил в виде сущности Rules, которая сглаживает правил и позволяет описывать их более лаконично

```
$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 функции для фильтрации значения, то стоит воспользоваться надсткойкой над этой билбиотекой -

###  Health Score

45

—

FairBetter than 92% of packages

Maintenance54

Moderate activity, may be stable

Popularity22

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity79

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~225 days

Recently: every ~191 days

Total

10

Last Release

1226d ago

Major Versions

1.0.0 → 2.0.02018-11-12

2.0.0 → 3.0.02019-01-16

3.0.2 → 4.0.02020-11-29

4.0.1 → 5.0.02021-12-26

PHP version history (5 changes)1.0.0PHP ^7.1

2.0.0PHP ^7.2

4.0.0PHP ^8.0

5.0.0PHP ^8.1

5.0.2PHP &gt;=8.1

### Community

Maintainers

![](https://www.gravatar.com/avatar/31106536118e11bf9d0c9d7f467db5b534efa9c46ee76680b308f0c39d9a798c?d=identicon)[alexpts](/maintainers/alexpts)

---

Top Contributors

[![alexpts](https://avatars.githubusercontent.com/u/1306916?v=4)](https://github.com/alexpts "alexpts (55 commits)")

---

Tags

data-mapperdtohydratormappertranslationdatamodelconvertermappertransformdto

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/alexpts-php-hydrator/health.svg)

```
[![Health](https://phpackages.com/badges/alexpts-php-hydrator/health.svg)](https://phpackages.com/packages/alexpts-php-hydrator)
```

###  Alternatives

[doctrine/mongodb-odm

PHP Doctrine MongoDB Object Document Mapper (ODM) provides transparent persistence for PHP objects to MongoDB.

1.1k23.3M302](/packages/doctrine-mongodb-odm)[kodeine/laravel-meta

Fluent Meta Data for Eloquent Models, as if it is a property on your model.

426756.0k9](/packages/kodeine-laravel-meta)[doctrine/phpcr-odm

PHP Doctrine Content Repository Object Document Mapper (ODM) provides transparent persistence for PHP objects.

1811.5M97](/packages/doctrine-phpcr-odm)[event4u/data-helpers

Framework-agnostic PHP library for data mapping, DTOs and utilities. Includes DataMapper, SimpleDto/LiteDto, DataAccessor/Mutator/Filter and helper classes (MathHelper, EnvHelper, etc.). Works with Laravel, Symfony/Doctrine or standalone PHP.

1421.5k](/packages/event4u-data-helpers)[sbsaga/toon

🧠 TOON for Laravel — a compact, human-readable, and token-efficient data format for AI prompts &amp; LLM contexts. Perfect for ChatGPT, Gemini, Claude, Mistral, and OpenAI integrations (JSON ⇄ TOON).

6115.6k](/packages/sbsaga-toon)[nutgram/hydrator

Hydrator for PHP 8.0+

12265.2k6](/packages/nutgram-hydrator)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
