xervice / array-handler
2.1.0
2019-05-01 20:13 UTC
Requires
- php: >=7.1.0
- xervice/core: ^4.0.0
Requires (Dev)
README
辅助模块,用于根据配置数组运行数组处理器。可用于编写数组-hydrator、验证器和映射器。
安装
composer require xervice/array-mapper
使用
首先,您必须编写您的字段处理器插件。该插件实现接口 \Xervice\ArrayHandler\Dependency\FieldHandlerPluginInterface。
<?php declare(strict_types=1); namespace XerviceTest\ArrayHandler\Business\Helper; use Xervice\ArrayHandler\Dependency\FieldHandlerPluginInterface; class TestFieldHandler implements FieldHandlerPluginInterface { /** * @param array $data * @param mixed $fieldName * @param string $config * * @return array */ public function handleSimpleConfig(array $data, $fieldName, string $config): array { $data[$fieldName] = $config; return $data; } /** * @param array $data * @param mixed $fieldName * @param array $config * * @return array */ public function handleNestedConfig(array $data, $fieldName, array $config): array { $data[$fieldName] = $config['testvalue'] ?? null; return $data; } /** * @param array $data * @param array $config * * @return array */ public function handleArrayConfig(array $data, array $config): array { $data = $config['testvalue'] ?? null; return $data; } /** * @param array $data * @param mixed $fieldName * @param callable $config * * @return array */ public function handleCallableConfig(array $data, $fieldName, callable $config): array { $data[$fieldName] = $config($data[$fieldName]); return $data; } }
您可以通过外观类使用数组映射器,通过 handleArray 方法。
$arrayMapperFacade->handleArray(
new TestFieldHandler(),
$payLoadArray,
$configArray
);
配置数组是一个可以包含简单值或数组的数组。在数组内部,它也可以是简单值、数组或可调用函数。根据这三种类型,您的 FieldMapper 中的方法将被调用。对于 FieldName,您可以使用直接方式使用字段名对于单维数组,或者使用点分隔的键链。您还可以通过使用通配符 .* 配置数组内的所有项目。
以上字段处理器的示例
$data = [ [ 'keyOne' => 'valueOne', 'keyTwo' => 'valueTwo', 'keyThree' => 'valueThree', 'keyFour' => 'valueFour', 'keyFive' => 'valueFive', 'keySix' => [ 'isNested' => [ 'foo' => 'bar' ], 'multi' => 'array' ], 'keySeven' => [ [ 'data' => 'test' ], [ 'data' => 'test' ], [ 'data' => 'test' ], [ 'data' => 'test' ] ], 'keyEight' => [ 'eightsElement' => 'string', 'nesting' => [ [ 'foo' => [ ['subfoo' => 'bar'], ['subfoo' => 'bar'], ['subfoo' => 'bar'], ['subfoo' => 'bar'], ['subfoo' => 'bar'] ] ], [ 'foo' => [ ['subfoo' => 'bar'], ['subfoo' => 'bar'], ['subfoo' => 'bar'], ['subfoo' => 'bar'], ['subfoo' => 'bar'] ] ], [ 'foo' => [ ['subfoo' => 'bar'], ['subfoo' => 'bar'], ['subfoo' => 'bar'], ['subfoo' => 'bar'], ['subfoo' => 'bar'] ] ], [ 'foo' => [ ['subfoo' => 'bar'], ['subfoo' => 'bar'], ['subfoo' => 'bar'], ['subfoo' => 'bar'], ['subfoo' => 'bar'] ] ], [ 'foo' => [ ['subfoo' => 'bar'], ['subfoo' => 'bar'], ['subfoo' => 'bar'], ['subfoo' => 'bar'], ['subfoo' => 'bar'] ] ] ] ] ] ]; $config = [ '*' => [ 'keyOne', 'keyFour', [ 'keyFive', 'keyTwo' => function ($value) { return $value . 'DONE'; }, 'keyThree' => [ 'testvalue' => 'TEST' ] ], [ 'keySix' => [ 'isNested' => function ($value) { return 'multiTest'; } ], 'keySix.*' => function ($value) { return $value . 'NESTED'; } ], [ 'keySeven.*' => [ FieldHandlerPluginInterface::HANDLE_THIS => [ 'testvalue' => [ 'data' => 'tested!' ] ] ], 'keyEight' => [ [ 'nesting.*' => [ [ 'foo.*' => [ FieldHandlerPluginInterface::HANDLE_THIS => [ 'testvalue' => [ 'subfoo' => 'bartested' ] ] ] ] ] ] ] ] ] ]; $result = [ [ 'keyOne' => 'keyOne', 'keyTwo' => 'valueTwoDONE', 'keyThree' => 'TEST', 'keyFour' => 'keyFour', 'keyFive' => 'keyFive', 'keySix' => [ 'multi' => 'arrayNESTED', 'isNested' => 'multiTestNESTED' ], 'keySeven' => [ [ 'data' => 'tested!' ], [ 'data' => 'tested!' ], [ 'data' => 'tested!' ], [ 'data' => 'tested!' ] ], 'keyEight' => [ 'eightsElement' => 'string', 'nesting' => [ [ 'foo' => [ ['subfoo' => 'bartested'], ['subfoo' => 'bartested'], ['subfoo' => 'bartested'], ['subfoo' => 'bartested'], ['subfoo' => 'bartested'] ] ], [ 'foo' => [ ['subfoo' => 'bartested'], ['subfoo' => 'bartested'], ['subfoo' => 'bartested'], ['subfoo' => 'bartested'], ['subfoo' => 'bartested'] ] ], [ 'foo' => [ ['subfoo' => 'bartested'], ['subfoo' => 'bartested'], ['subfoo' => 'bartested'], ['subfoo' => 'bartested'], ['subfoo' => 'bartested'] ] ], [ 'foo' => [ ['subfoo' => 'bartested'], ['subfoo' => 'bartested'], ['subfoo' => 'bartested'], ['subfoo' => 'bartested'], ['subfoo' => 'bartested'] ] ], [ 'foo' => [ ['subfoo' => 'bartested'], ['subfoo' => 'bartested'], ['subfoo' => 'bartested'], ['subfoo' => 'bartested'], ['subfoo' => 'bartested'] ] ] ] ] ] ];