roke22/array-to-object-factory

将数组自动映射到对象构造函数参数的对象

dev-main 2022-11-06 23:21 UTC

This package is auto-updated.

Last update: 2024-09-29 14:08:50 UTC


README

什么是数组到对象工厂?

这是一个实用工具,可以帮助您创建一个类及其所有依赖项,而无需映射值。

所有对象都使用构造方法创建,因此数据必须满足您拥有的验证。

唯一的要求是数组的值的索引必须组织在同一层级的层次结构中。

它已声明严格类型,因此值 1 与 '1' 不同。PHP 不会尝试将整数 1 转换为字符串 '1'。在这种情况下,您将获得 TypeError 异常。

示例

class SimpleClass
{
    protected string $name;
    protected bool $isActive;

    public function __construct(string $name, bool $isActive)
    {
        $this->name = $name;
        $this->isActive = $isActive;
    }
}

您可以这样做来创建此类

$data = [
    'name' => 'John Doe',
    'is_active' => false
];

$object = ArrayToObject::make($data, SimpleClass::class);

数组索引被转换为蛇形、骆驼和studly格式,以在数组数据和对象构造函数参数之间找到匹配。

您可以通过传递第三个参数来限制转换,如下所示

$object = ArrayToObject::make($data, SimpleClass::class, ArrayToObject::SNAKE);

或者甚至不转换任何数据

$object = ArrayToObject::make($data, SimpleClass::class, ArrayToObject::NONE);

可能的值

ArrayToObject::ALL // By default
ArrayToObject::SNAKE
ArrayToObject::CAMEL
ArrayToObject::STUDLY
ArrayToObject::NONE

获取原始 $data 数组作为示例

$data = [
    'name' => 'John Doe',
    'is_active' => false
];

数组到对象工厂转换为以下数组

$data = [
    'name' => 'John Doe',
    'is_active' => false,
    'isActive' => false,
    'IsActive' => false,
];

如果原始数组中存在一些索引转换,则数据将被覆盖,并且对象可能使用错误的数据构建,要解决这个问题,您可以强制转换类型为 NONE 或仅需要的注释

示例复杂类

class Classroom
{
    protected int $number;
    protected Course $course;

    public function __construct(int $number, Course $course)
    {
        $this->number = $number;
        $this->course = $course;
    }
}

class Course
{
    protected string $name;

    public function __construct(string $name)
    {
        $this->name = $name;
    }
}

$data = [
    'number' => 1,
    'course' => [
        'Maths'
    ]
];

$result = ArrayToObject::make($data, Classroom::class);

更多示例

您可以查看测试文件夹以查看一些集合和更复杂类的示例。

请随时报告任何问题并进行任何拉取请求以改进该包。

谢谢。