alexpts / php-hydrator
将模型转换为 DTO,将 DTO 转换为模型
5.0.2
2023-01-05 11:02 UTC
Requires
- php: >=8.1
Requires (Dev)
- fzaninotto/faker: dev-master
- phpunit/phpunit: ^9.5
Suggests
- ext-blackfire: *
- blackfire/php-sdk: ^1.30
README
需要以不同形式展示相同的数据。在代码中,使用高级模型比较方便。但是,通常需要将这些数据转换为更简单的形式,通常是关联数组,以便在数据库中保存。在应用程序之间传输数据时,通常使用简单的 DTO 实体。
该组件允许您轻松地将数据从模型转换为关联数组,并反过来使用数据填充模型。
提取器
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 字段映射到 DTO 实体中的 login 字段,如下所示。
$rules = [ 'login' => [ 'prop' => 'name', ], ... ]; $extractor->extract($model, $rules);
通过 prop 提取可以提取模型中的任何可见性(public/protected/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);
getter 比属性 prop 具有更高的优先级。
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);
hydrator 规则与 extractor 实体规则相同。
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);
更多功能
如果需要递归 hydrate/extract 依赖关系,需要声明性定义转换规则,调用 pipe 函数来过滤值,那么可以使用这个库的扩展 - https://github.com/alexpts/php-data-transformer2