fi1a / hydrator
PHP hydrator - это библиотека для переноса данных из массива в объект и из объекта в массив
Installs: 2 034
Dependents: 3
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
Requires
- php: ^7.3 || ^8
Requires (Dev)
- captainhook/captainhook: ^5.4
- phpunit/phpunit: ^9.3
- slevomat/coding-standard: ^6.3
- squizlabs/php_codesniffer: ^3.5
- vimeo/psalm: ^4.3
README
Библиотека позволяет переносить данные из массива в объект и обратно.
Возможны следующие операции:
- конвертация данных в
Array
изObject
; - заполнить данными
Object
изArray
.
Установка
Установить этот пакет можно как зависимость, используя Composer.
composer require fi1a/hydrator
Hydrator. Перенос данных из массива в объект
Класс Fi1a\Hydrator\Hydrator()
позволяет заполнить данными объект.
Пример:
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
:
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
Служит для переноса данных из массива в объект без вызова методов сеттеров объекта. Является поведением по умолчанию.
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
Служит для переноса данных из массива в объект с вызовом сеттеров.
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
Служит для переноса данных из массива в объект с вызовом только публичных сеттеров.
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()
осуществляет извлечение данных из объекта в массив.
Пример:
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
:
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
не переданы, будут получены все публичные свойства объекта
и свойства, имеющие публичные геттеры, иначе будут получены только переданные свойства. Является поведением по умолчанию.
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
не переданы, будут получены все свойства объекта и вызваны их геттеры,
иначе будут получены только переданные свойства.
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
не переданы, будут получены все публичные свойства объекта,
иначе будут получены только переданные свойства.
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
не переданы, будут получены все свойства объекта,
иначе будут получены только переданные свойства.
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":
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":
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]