recoded-dev/object-hydrator

PHP库,帮助您从原始数据中提取对象

dev-main 2024-05-20 20:17 UTC

This package is auto-updated.

Last update: 2024-09-20 20:57:50 UTC


README

轻量级、零依赖PHP库,帮助您从原始数据中提取DTO。

安装

composer require recoded-dev/object-hydrator

用法

提取

考虑以下类

<?php

namespace Acme;

use Recoded\ObjectHydrator\Attributes\SnakeCase;

#[SnakeCase]
readonly class User
{
    public function __construct(
        public string $firstName,
        public string $lastName,
        public string $email,
    ) {
    }
}

此类可以按照以下方式提取

use Acme\User;
use Recoded\ObjectHydrator\Hydration\ReflectionHydrator;

$dto = (new ReflectionHydrator())->hydrate([
    'first_name' => 'John',
    'last_name' => 'Doe',
    'email' => 'john-doe@example.org',
], User::class);

自定义数据映射

您可以创建一个新的属性,实现Recoded\ObjectHydrator\Contracts\Mapping\DataMapper接口,这将确保它被包拾取并用于映射。

在接口的map方法中,您将作为第一个参数接收到当前值。您返回的将成为新的值,并且您的其他映射属性将在您的之后接收该值作为它们的第一个参数。

对于简单的示例,请参阅EmptyStringToNull属性。

优化(转储和缓存)

为了从该包中获得最佳性能,我们必须消除每次提取时的反射。转储可以实现这一点。它运行一次反射计划,并将其存储在静态文件中。

实际上,转储相当简单。您只需要将以下代码片段放入一个脚本或命令中,每次您的DTO更改时都运行

(new Dumper())
    ->classes([FooBarDTO::class])
    ->dump($path);

利用您的转储提取计划也非常简单。您应该使用Recoded\ObjectHydrator\Hydration\CachedHydrator而不是ReflectionHydrator,并在构造提取器时将转储路径作为第一个参数传递。如下所示

use Recoded\ObjectHydrator\Hydration\CachedHydrator;

$hydrator = new CachedHydrator('/path/to/dump.php');

$hydrator->hydrate([...], DTO::class);

如果您正在使用容器,可能值得将您使用的任何提取器绑定到Recoded\ObjectHydrator\Contracts\Hydrator接口。该接口包含hydrate方法,这正是您需要的。

贡献

每个人都欢迎贡献。如果您认为工作准备好了,请随时提交PR。或者,如果您想获得一些意见或进一步的帮助,可以打开一个草稿-PR。

我希望保持此包相对较小,并避免臃肿。该包应保持可扩展和无偏见。