xervice/array-handler

2.1.0 2019-05-01 20:13 UTC

This package is auto-updated.

Last update: 2024-09-29 04:43:34 UTC


README

Scrutinizer Code Quality Code Coverage

辅助模块,用于根据配置数组运行数组处理器。可用于编写数组-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']
                  ]
              ]
          ]
      ]
  ]
];