acelot/automapper

适用于 PHP 8 的强大声明式数据映射器

2.0.0 2023-01-29 14:55 UTC

This package is auto-updated.

Last update: 2024-09-08 06:32:20 UTC


README

ℹ️ 您正在使用 acelot/automapper 的第二个版本分支。如果您想使用旧版本,请转到 1.x 分支。

build coverage packagist dependencies MIT

AutoMapper 是一个适用于 PHP 8 的强大声明式数据映射器。AutoMapper 可以将数据从任何源数据(通常是数组/对象)映射到现有的数组/对象,或者封装一个新的数组/对象。

💿 安装

composer require acelot/automapper:^2.0

🗿 使用方法

如何从另一个数组封装新的数组?

use Acelot\AutoMapper\Context;
use Acelot\AutoMapper\AutoMapper as a;

$source = [
    'id' => '99',
    'name' => [
        'lastname' => 'Doe',
        'firstname' => 'John',
    ],
    'skills' => 'Php, CSS,JS,html, MySql,  brainfuck,'
];

$result = a::marshalArray(
    new Context(),
    $source,
    a::toKey('id', a::pipe(
        a::get('[id]'),
        a::toInt()
    )),
    a::toKey('fullname', a::pipe(
        a::get('[name]'),
        a::call(fn($v) => $v['firstname'] . ' ' . $v['lastname'])
    )),
    a::toKey('skills', a::pipe(
        a::get('[skills]'),
        a::explodeString(','),
        a::mapIterable(a::pipe(
            a::trimString(),
            a::ifEmpty(a::ignore()),
            a::call('strtolower')
        )),
        a::toArray(),
        a::sortArray()
    ))
);

// Output of `var_export($result)`
array(
  'id' => 99,
  'fullname' => 'John Doe',
  'skills' => [
    0 => 'brainfuck',
    1 => 'css',
    2 => 'html',
    3 => 'js',
    4 => 'mysql',
    5 => 'php',
  ],
)

如何将数据从源映射到现有数组?

显示代码
use Acelot\AutoMapper\Context;
use Acelot\AutoMapper\AutoMapper as a;

$source = [
    'title' => '  Product title  ',
    'desc' => [
        'Product short description',
        'Product regular description',
        'Product descriptive description',
    ]
];

$target = [
    'id' => 5,
    'title' => 'Current title',
];

$result = a::map(
    new Context(),
    $source,
    $target,
    a::toKey('title', a::pipe(
        a::get('[title]'),
        a::trimString()
    )),
    a::toKey('description', a::get('[desc][#last]')),
);

// Output of `var_export($result)`
array (
  'id' => 5,
  'title' => 'Product title',
  'description' => 'Product descriptive description',
)

📌 示例

所有示例都可以在 tests/Functional 目录中找到。

🗄️ 参考

不需要使用具体的类,最好使用 AutoMapper API 的 静态函数。将 AutoMapper 作为短别名导入非常方便,例如 use Acelot\AutoMapper\AutoMapper as a

主要功能

AutoMapper 的主要功能。

字段定义

有助于您塑造目标结构的定义。

处理器

核心值处理器。处理器的目的是检索值或修改传入的值,并将其传递给下一个处理器。

助手

助手是建立在另一个处理器之上的处理器。一些助手只是具有特定参数的核心处理器的简写,而另一些则是多个处理器的组合。

🧩 集成

🤨 常见问题解答

什么是上下文?

Context 是一个用于存储任何类型数据的特殊 DTO 类:配置、数据库连接、测试数据等。这个 DTO 被传递给映射器,您可以在处理器中使用您自己的数据。能够处理上下文的处理器以 Ctx 后缀结尾,例如 callCtx

如何使用 get 处理器?

您可以使用接受特殊路径字符串的 get 处理器从源获取任何键/属性/方法。该处理器解析提供的路径,将其分解成部分,然后根据路径的部分提取数据。

可用的路径部分

您可以将部分组合起来获取深层次的值

[array_key][array key with spaces][#first][#last]->property->{property with spaces}->someMethod()

如果路径的任何部分找不到,则处理器将返回 NotFoundValue 值。此值会抛出 NotFoundException,但您可以使用 ifNotFound 助手恢复。

🖋️ 许可证

根据 MIT 许可证授权。版权所有 (c) 2017-至今,Valeriy Protopopov