Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/fi1a/hydrator
PHP hydrator - это библиотека для переноса данных из массива в объект и из объекта в массив
https://github.com/fi1a/hydrator
dto extractor hydrator php
Last synced: about 1 month ago
JSON representation
PHP hydrator - это библиотека для переноса данных из массива в объект и из объекта в массив
- Host: GitHub
- URL: https://github.com/fi1a/hydrator
- Owner: fi1a
- License: mit
- Created: 2022-11-29T02:57:48.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2023-02-21T01:38:17.000Z (almost 2 years ago)
- Last Synced: 2024-09-21T12:57:12.843Z (4 months ago)
- Topics: dto, extractor, hydrator, php
- Language: PHP
- Homepage:
- Size: 60.5 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# PHP hydrator - это библиотека для переноса данных из массива в объект и из объекта в массив
[![Latest Version][badge-release]][packagist]
[![Software License][badge-license]][license]
[![PHP Version][badge-php]][php]
![Coverage Status][badge-coverage]
[![Total Downloads][badge-downloads]][downloads]
[![Support mail][badge-mail]][mail]Библиотека позволяет переносить данные из массива в объект и обратно.
Возможны следующие операции:
- конвертация данных в `Array` из `Object`;
- заполнить данными `Object` из `Array`.## Установка
Установить этот пакет можно как зависимость, используя Composer.
``` bash
composer require fi1a/hydrator
```## Hydrator. Перенос данных из массива в объект
Класс `Fi1a\Hydrator\Hydrator()` позволяет заполнить данными объект.
Пример:```php
use Fi1a\Hydrator\Hydrator;class Foo {
/**
* @var string
*/
public $propertyBar;
/**
* @var int
*/
protected $propertyBaz;/**
* @var bool
*/
private $propertyQux;
}$hydrator = new Hydrator();
/**
* @var Foo $model
*/
$model = $hydrator->hydrate([
'propertyBar' => 'value',
'propertyBaz' => 1,
'propertyQux' => true,
], Foo::class);$model->propertyBar; // 'value'
```Метод `hydrate` создает объект переданного класса, для заполнения данными уже существующего объекта нужно использовать
метод `hydrateModel`:```php
use Fi1a\Hydrator\Hydrator;
use Fi1a\Hydrator\Hydrates\Hydrate;class Foo {
/**
* @var string
*/
public $propertyBar;/**
* @var int
*/
protected $propertyBaz;/**
* @var bool
*/
private $propertyQux;
}$hydrator = new Hydrator();
$model = new Foo();
$hydrator->hydrateModel([
'propertyBar' => 'value',
'propertyBaz' => 1,
'propertyQux' => true,
], $model);$model->propertyBar; // 'value'
```### Поведение Fi1a\Hydrator\Hydrates\Hydrate
Служит для переноса данных из массива в объект без вызова методов сеттеров объекта. Является поведением по умолчанию.
```php
use Fi1a\Hydrator\Hydrator;class Foo {
/**
* @var string
*/
public $propertyBar;
/**
* @var int
*/
protected $propertyBaz;/**
* @var bool
*/
private $propertyQux;
}$hydrator = new Hydrator();
/**
* @var Foo $model
*/
$model = $hydrator->hydrate([
'propertyBar' => 'value',
'propertyBaz' => 1,
'propertyQux' => true,
], Foo::class);$model->propertyBar; // 'value'
```### Поведение Fi1a\Hydrator\Hydrates\HydrateCallSetters
Служит для переноса данных из массива в объект с вызовом сеттеров.
```php
use Fi1a\Hydrator\Hydrator;
use Fi1a\Hydrator\Hydrates\HydrateCallSetters;class Foo {
public $propertyBar;protected $propertyBaz;
private $propertyQux;
protected function setPropertyBaz(int $propertyBaz): void
{
$this->propertyBaz = $propertyBaz + 1;
}public function getPropertyBaz(): int
{
return $this->propertyBaz;
}
}$hydrator = new Hydrator(new HydrateCallSetters());
/**
* @var Foo $model
*/
$model = $hydrator->hydrate([
'propertyBar' => 'value',
'propertyBaz' => 1,
'propertyQux' => true,
], Foo::class);$model->getPropertyBaz(); // 2
```### Поведение Fi1a\Hydrator\Hydrates\HydratePublicCallSetters
Служит для переноса данных из массива в объект с вызовом только публичных сеттеров.
```php
use Fi1a\Hydrator\Hydrator;
use Fi1a\Hydrator\Hydrates\HydratePublicCallSetters;class Foo {
public $propertyBar;protected $propertyBaz;
private $propertyQux;
public function setPropertyBaz(int $propertyBaz): void
{
$this->propertyBaz = $propertyBaz + 2;
}public function getPropertyBaz(): int
{
return $this->propertyBaz;
}
}$hydrator = new Hydrator(new HydratePublicCallSetters());
/**
* @var Foo $model
*/
$model = $hydrator->hydrate([
'propertyBar' => 'value',
'propertyBaz' => 1,
'propertyQux' => true,
], Foo::class);$model->getPropertyBaz(); // 3
```## Extractor. Перенос данных из объекта в массив
Класс `Fi1a\Hydrator\Extractor()` осуществляет извлечение данных из объекта в массив.
Пример:```php
use Fi1a\Hydrator\Extractor;class Foo {
/**
* @var string
*/
public $propertyBar = 'value';/**
* @var int
*/
protected $propertyBaz = 1;/**
* @var bool
*/
private $propertyQux = true;
}$model = new Foo();
$hydrator = new Extractor();
$data = $hydrator->extract($model); // ['propertyBar' => 'value',]
```Можно указать какие свойства нужно извлечь с помощью аргумента `$keys` метода `Fi1a\Hydrator\Extractor::extract`:
```php
use Fi1a\Hydrator\Extractor;class Foo {
/**
* @var string
*/
public $propertyBar = 'value';/**
* @var int
*/
protected $propertyBaz = 1;/**
* @var bool
*/
private $propertyQux = true;
}$model = new Foo();
$hydrator = new Extractor();
$data = $hydrator->extract($model, ['propertyBar', 'propertyBaz']); // ['propertyBar' => 'value', 'propertyBaz' => 1,]
```### Поведение Fi1a\Hydrator\Extracts\ExtractPublicCallGetters
Осуществляет перенос данных из объекта в массив с вызовом публичных геттеров.
Если ключи массива в метод `Fi1a\Hydrator\Extractor::extract` не переданы, будут получены все публичные свойства объекта
и свойства, имеющие публичные геттеры, иначе будут получены только переданные свойства. Является поведением по умолчанию.```php
use Fi1a\Hydrator\Extractor;
use Fi1a\Hydrator\Extracts\ExtractPublicCallGetters;class Foo {
/**
* @var string
*/
public $propertyBar = 'value';/**
* @var int
*/
protected $propertyBaz = 1;/**
* @var bool
*/
private $propertyQux = true;public function getPropertyBaz(): int
{
return $this->propertyBaz;
}
}$model = new Foo();
$hydrator = new Extractor(new ExtractPublicCallGetters());
$data = $hydrator->extract($model); // ['propertyBar' => 'value', 'propertyBaz' => 1,]
```### Поведение Fi1a\Hydrator\Extracts\ExtractCallGetters
Осуществляет перенос данных из объекта в массив с вызовом геттеров.
Если ключи массива в метод `Fi1a\Hydrator\Extractor::extract` не переданы, будут получены все свойства объекта и вызваны их геттеры,
иначе будут получены только переданные свойства.```php
use Fi1a\Hydrator\Extractor;
use Fi1a\Hydrator\Extracts\ExtractCallGetters;class Foo {
/**
* @var string
*/
public $propertyBar = 'value';/**
* @var int
*/
protected $propertyBaz = 1;/**
* @var bool
*/
private $propertyQux = true;public function getPropertyBaz(): int
{
return $this->propertyBaz;
}
}$model = new Foo();
$hydrator = new Extractor(new ExtractCallGetters());
$data = $hydrator->extract($model); // ['propertyBar' => 'value', 'propertyBaz' => 1, 'propertyQux' => true]
```### Поведение Fi1a\Hydrator\Extracts\ExtractPublic
Осуществляет перенос публичных свойств из объекта в массив.
Если ключи массива в метод `Fi1a\Hydrator\Extractor::extract` не переданы, будут получены все публичные свойства объекта,
иначе будут получены только переданные свойства.```php
use Fi1a\Hydrator\Extractor;
use Fi1a\Hydrator\Extracts\ExtractPublic;class Foo {
/**
* @var string
*/
public $propertyBar = 'value';/**
* @var int
*/
protected $propertyBaz = 1;/**
* @var bool
*/
private $propertyQux = true;public function getPropertyBaz(): int
{
return $this->propertyBaz;
}
}$model = new Foo();
$hydrator = new Extractor(new ExtractPublic());
$data = $hydrator->extract($model); // ['propertyBar' => 'value',]
```### Поведение Fi1a\Hydrator\Extracts\Extract
Осуществляет перенос данных из объекта в массив.
Если ключи массива в метод `Fi1a\Hydrator\Extractor::extract` не переданы, будут получены все свойства объекта,
иначе будут получены только переданные свойства.```php
use Fi1a\Hydrator\Extractor;
use Fi1a\Hydrator\Extracts\Extract;class Foo {
/**
* @var string
*/
public $propertyBar = 'value';/**
* @var int
*/
protected $propertyBaz = 1;/**
* @var bool
*/
private $propertyQux = true;public function getPropertyBaz(): int
{
return $this->propertyBaz;
}
}$model = new Foo();
$hydrator = new Extractor(new Extract());
$data = $hydrator->extract($model); // ['propertyBar' => 'value', 'propertyBaz' => 1, 'propertyQux' => true]
```## Наименование ключей массива
Для определения наименования ключей массива используются классы реализующие интерфейс `Fi1a\Hydrator\KeyName\KeyNameInterface`.
Объект данного класса передается в конструктор переноса данных из массива в объект и обратно.- `Fi1a\Hydrator\KeyName\Camelize` преобразует в "stringHelper" название ключей массива;
- `Fi1a\Hydrator\KeyName\Humanize` преобразует в "string_helper" название ключей массива;По умолчанию используется "stringHelper" название ключей массива (`Fi1a\Hydrator\KeyName\Camelize`).
Пример переноса данных из массива в объект с наименованием ключей массива "string_helper":
```php
use Fi1a\Hydrator\Hydrator;
use Fi1a\Hydrator\Hydrates\Hydrate;
use Fi1a\Hydrator\KeyName\Humanize;class Foo {
/**
* @var string
*/
public $propertyBar;/**
* @var int
*/
protected $propertyBaz;/**
* @var bool
*/
private $propertyQux;
}$hydrator = new Hydrator(new Hydrate(new Humanize()));
$model = new Foo();
$hydrator->hydrateModel([
'property_bar' => 'value',
'property_baz' => 1,
'property_qux' => true,
], $model);$model->propertyBar; // 'value'
```
Пример переноса данных из объекта в массив с наименованием ключей массива "string_helper":```php
use Fi1a\Hydrator\Extractor;
use Fi1a\Hydrator\Extracts\Extract;
use Fi1a\Hydrator\KeyName\Humanize;class Foo {
/**
* @var string
*/
public $propertyBar = 'value';/**
* @var int
*/
protected $propertyBaz = 1;/**
* @var bool
*/
private $propertyQux = true;public function getPropertyBaz(): int
{
return $this->propertyBaz;
}
}$model = new Foo();
$hydrator = new Extractor(new Extract(new Humanize()));
$data = $hydrator->extract($model); // ['property_bar' => 'value', 'property_baz' => 1, 'property_qux' => true]
```[badge-release]: https://img.shields.io/packagist/v/fi1a/hydrator?label=release
[badge-license]: https://img.shields.io/github/license/fi1a/hydrator?style=flat-square
[badge-php]: https://img.shields.io/packagist/php-v/fi1a/hydrator?style=flat-square
[badge-coverage]: https://img.shields.io/badge/coverage-100%25-green
[badge-downloads]: https://img.shields.io/packagist/dt/fi1a/hydrator.svg?style=flat-square&colorB=mediumvioletred
[badge-mail]: https://img.shields.io/badge/mail-support%40fi1a.ru-brightgreen[packagist]: https://packagist.org/packages/fi1a/hydrator
[license]: https://github.com/fi1a/hydrator/blob/master/LICENSE
[php]: https://php.net
[downloads]: https://packagist.org/packages/fi1a/hydrator
[mail]: mailto:[email protected]