alexpts/php-hydrator

将模型转换为 DTO,将 DTO 转换为模型

5.0.2 2023-01-05 11:02 UTC

This package is auto-updated.

Last update: 2024-09-05 14:36:48 UTC


README

phpunit codecov

需要以不同形式展示相同的数据。在代码中,使用高级模型比较方便。但是,通常需要将这些数据转换为更简单的形式,通常是关联数组,以便在数据库中保存。在应用程序之间传输数据时,通常使用简单的 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