alexrili/phmap

负载映射和转换。从A结构到B结构

v1.1.3 2022-12-15 02:15 UTC

This package is auto-updated.

Last update: 2024-09-15 06:12:19 UTC


README

这是一个用PHP编写的负载映射。这个库可以帮助您从A结构中获取值并将其放置在B结构上

Screenshot 2022-12-04 at 02 09 39

注意:Phmap底层使用illuminate/support。如果您使用laravel或lumen框架,请确保您的版本是>= 9.x,如果您不使用这些框架或此依赖项(illuminate/support),则无需担心。

安装

通过Composer

$ composer require alexrili/phmap

基本用法

在底层,我们提供了一个payload_map()辅助函数。该payload_map()接受两个参数:1°是您的输入数据,2°是您的映射配置。两者都需要是数组类型。下面是一个例子。

#can be a response from api request
$inputData = [
    'a' => 'Value from A'
];

$map = [
    'from' => 'a',
    'to' => 'b'
];

$response = payload_map($inputData, $map);
// var_dump($response);
// return will be
array:1 [
    "b" => "Value from A"
]

现在让我们想象您有一个来自数组的多个值,并需要更改内部属性。使用Phmap您就可以做到这一点:)

# e.g: Imagine that you have the following payload

$oldPayload = [
    'addresses' => [
        [
            'mainAddress' => true,
            'address' => '54 St',
            'code' => '676329-098'
        ],
        [
            'mainAddress' => false,
            'address' => 'Saint Louis Av',
            'code' => '4432-098'
        ]
    ]
];

$map = [
    [
        'from' => 'addresses.*.address',
        'to' => 'users_addresses.*.street_name'
    ],
    [
        'from' => 'addresses.*.code',
        'to' => 'users_addresses.*.postal_code'
    ]    
];

$newPayload = payload_map($inputData, $map);
// var_dump($newPayload);
// return will be
array:2 [
     "users_addresses" => [
        [
            "street_name" => "54 St",
            "postal_code" => "676329-098"
        ],
        [
            "street_name" => "Saint Louis Av",
            "postal_code" => "4432-098
        ]
    ]
]

注意:在新的负载中没有mainAddress属性,这是因为我们没有告诉负载映射映射该属性

映射配置

直接值

您可以直接映射结构中的值,只需在from键中指定值的位置,并在to键中指定目标路径

[
    "from" =>"a",
    "to" => "b" 
]

连接值

您可以使用.+.符号连接一个或多个值

[
    "from" =>"a.a1.+.a.a2",
    "to" => "b" 
]

固定值

您可以使用__()__符号添加一些固定值

[
    "from" =>"__(This is a fixed value)__",
    "to" => "b" 
]

值集合(数组)

您可以使用.*.符号映射数组中的嵌套属性

[
    "from" =>"a.*.a1",
    "to" => "b.*.b1" 
]

一个或另一个值

您可以将两个(或更多)不同的路径映射到一个值,然后Phmap将遍历所有路径直到找到值。要指定一个或另一个值,您可以使用||符号

[
    "from" =>"a||a1",
    "to" => "b" // if finds value in [a], brings [a], if not try to brings [b]
]

可空值

您可能需要映射一些具有null值的属性,为此,您只需传递一个字符串标志nullable,它可以是以下两个值之一 ["true"|"false"],如果为true,则表示即使值是null,您也想将该属性带到您的新结构中。

默认值是"false"

[
    "from" =>"a",
    "to" => "b" 
    "nullable" => "true" 
    // if [a] don't have value
    // the results will be ["b"=>null] 
]

高级用法

$inputData = [
    'a' => [
        [
            'ac1' => 'I`m a multilevel value'
        ],
        [
            'ac1' => 'I`m a multilevel value',
        ]
    ],
    'aDV' => 'I`m a directed value'
];

$map = [
    [
        'from' => 'a.*.ac1.+.__(I`m a fixed value)__.+.aDV',
        'to' => 'b.*.bc'
    ]
];

$response = payload_map($inputData, $map);
// var_dump($response)
// result wil be
array:1 [
  "b" => array:2 [
    0 => array:1 [
      "bc" => "I`m a multilevel valueI`m a fixed valueI`m a directed value"
    ]
    1 => array:1 [
      "bc" => "I`m a multilevel valueI`m a fixed valueI`m a directed value"
    ]
  ]
]

变更日志

有关最近更改的更多信息,请参阅变更日志

测试

$ composer test

贡献

有关详细信息,请参阅贡献指南行为准则

安全性

如果您发现任何与安全相关的问题,请通过电子邮件联系alexrili而不是使用问题跟踪器。

致谢

  • [Alex Ribeiro][link-author]
  • [所有贡献者][link-contributors]

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件