fi1a / hydrator
PHP hydrator 是一个用于将数据从数组转移到对象,以及从对象转移到数组的库
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
该库允许将数据从数组转移到对象,以及从对象转移到数组。
以下是一些可能的操作
- 将数据从
Object转换为Array; - 使用
Array填充Object。
安装
可以使用 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 行为
用于从数组到对象转移数据,而不调用对象的setter方法。这是默认行为。
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 行为
用于从数组到对象转移数据,并调用setter方法。
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 行为
用于从数组到对象转移数据,并只调用公共setter方法。
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',]
可以使用 Fi1a\Hydrator\Extractor::extract 方法的 $keys 参数指定要提取哪些属性。
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 行为
从对象到数组转移数据,调用公共getter方法。如果未在 Fi1a\Hydrator\Extractor::extract 方法中传递数组键,则将获取所有公共属性和具有公共getter的属性,否则将仅获取传递的属性。这是默认行为。
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 行为
从对象到数组转移数据,调用getter方法。如果未在 Fi1a\Hydrator\Extractor::extract 方法中传递数组键,则将获取所有属性和调用它们的getter,否则将仅获取传递的属性。
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]