詹姆斯·哈尔索尔 / object-hydrator
使用反射进行构造函数或设置器注入的简单对象注水器。
1.2.0
2016-08-06 10:41 UTC
Requires
- php: >=5.4
- danielstjules/stringy: ^1.6
- symfony/property-access: ^2.7|^3.0
Requires (Dev)
- fzaninotto/faker: ^1.6
- phpunit/phpunit: ^5.4
README
一个使用反射进行构造函数或设置器注入的简单对象注水器。
注水器接收一个原始数据数组,并用这些数据给指定类的一个或多个对象注水。
用法
提供了两种主要的注水器类型,分别是 ObjectConstructorFromArrayHydrator
和 ObjectSetterFromArrayHydrator
,允许您通过构造函数或设置器进行注水。
构造函数注水
如果您的对象使用构造函数注入,则可以使用 ObjectConstructorFromArrayHydrator
实例注水您的对象。
示例
$data = ['name' => 'Frank Turner', 'job_title' => 'Musician']; $hyrdator = new ObjectConstructorFromArrayHydrator(); $person = $hydrator->hydrate('Person\Employee', $data);
Person\Employee
类看起来如下
<?php namespace Person; class Employee { private $name; private $jobTitle; public function __construct($name, $jobTitle) { $this->name = $name; $this->jobTitle = $jobTitle; } }
设置器注水
如果您的对象使用设置器注入,则可以使用 ObjectSetterFromArrayHydrator
实例注水您的对象。
示例
$data = ['name' => 'Frank Turner', 'job_title' => 'Musician']; $hyrdator = new ObjectSetterFromArrayHydrator(); $person = $hydrator->hydrate('Person\Employee', $data);
Person\Employee
类看起来如下
<?php namespace Person; class Employee { private $name; private $jobTitle; public function setName($name) { $this->name = $name; } public function setJobTitle($jobTitle) { $this->jobTitle = $jobTitle; } }
使用设置器注水器,您也可以将现有对象传递给注水器,而不是类名
$data = ['name' => 'Frank Turner', 'job_title' => 'Musician']; $hydrator = new ObjectSetterFromArrayHydrator(); $person = new Person(); $hydrator->hydrate($person, $data);
注水集合
有时您可能有一个数组的数组,每个数组代表一个模型的原始数据。您可以在一个方法调用中注水这些数据,例如
$data = [['name' => 'Frank Turner', 'job_title' => 'Musician'], ['name' => 'Steve Jobs', 'job_title' => 'CEO']]; $hydrator = new ObjectSetterFromArrayHydrator(); $hydratedObjects = $hydrator->hydrateCollection('Person\Employee', $data);
注意:您不能将对象传递给 hydrateCollection
方法,它必须是可调用的或包含完全限定类名 (FQCN) 的字符串。
可调用类名
在注水对象时,您传递给 hydrate
或 hydrateCollection
方法的第一个参数是要创建实例的完全限定类名 (FQCN)。您可以使用可调用来代替 FQCN。可调用将接收您作为第二个参数传递的原始数据 ($data
)。
示例
$data = ['name' => 'Frank Turner', 'job_title' => 'Musician']; $hydrator = new ObjectConstructorFromArrayHydrator(); $person = $hydrator->hydrate(function ($rawData) { if ($rawData['job_title' === 'Musician']) { return 'Person\Musician'; } return 'Person\Employee'; }, $data);
路线图
- 添加工厂以改善注水器的实例化可读性
- 探索添加支持嵌套对象注水的选项
允许将对象实例传递给注水器而不是类名