rollun-com/rollun-datahandler

此包的最新版本(4.0.2)没有提供许可证信息。

Rollun zend-expressive 框架。开始开发应用仅需几秒钟!


README

《rollun-datahandler》库扩展了标准库 zendframework\zend-filterzendframework\zend-validatorsymfony\expression-language,同时还增加了处理器。

过滤器

过滤器扩展了标准库 zendframework\zend-filter

过滤器列表

  • DuplicateSymbol - 将重复的符号(符号序列)替换为指定的符号(默认替换为重复的符号)
  • Evaluation - 计算输入字符串上的表达式(表达式语言)并返回其值
  • RemoveDigits - 删除字符串中的所有数字,保留一个空格('a1c' => 'a c')
  • RqlReplace - 过滤器,将所有 rql 匹配项替换为指定的字符串
  • SortSymbols - 对字符串中的符号进行排序(不考虑哪些符号)
  • SortWords - 对字符串中的单词进行排序

处理器

处理器对输入数组执行某些操作。处理器的本质是处理数据。它可以返回未修改的数组,同时处理数据并对其执行某些操作:记录到日志、发送电子邮件等。

示例

$processor = new Concat([
    'columns' => [1, 2],
    'delimiter' => '-',
    'resultColumn' => 3,
]);

var_dump($processor->process(['a', 'b'])); // displays ['a', 'b', 'a-b']

处理器列表

  • Concat - 将数组的值连接并记录到同一数组的列中
  • Evaluation - 对数组元素计算表达式(其中键是表达式中变量的名称,值是变量的值)并将结果记录到同一数组的列中
  • FilterApplier - 将过滤器应用于指定的数组列

FilterApplier

示例

$processor = new FilterApplier($options);

var_dump($processor->process(['1a2b3', 'b'])); // displays ['1a2b3', '321']

FilterApplier 的 $options 数组的示例。 有关如何使用工厂设置选项的详细信息

$options = [
    // Filters for applying
    // Key in array is a priority of filter
    'filters' => [
        0 => [
             'service' => 'digits',
        ],
        1 => [
            'service' => 'rqlReplace',
            'options' => [ // optional
                'pattern' => '123',
                'replacement' => '321',
            ],
        ],
    ],
    'argumentColumn' => 1,
    'resultColumn' => 2, // optional (will save to argumentColumn)
];

所有处理器(包括 FilterApplier)都可以接受一个验证器作为第二个参数。验证器将接收到与处理器相同的数组。如果数组无效,则处理器不会处理它。

$validator = new EmailAddress();
$processor = new FilterApplier($options, $validator);

var_dump($processor->process(['1a2b3', '123'])); // displays ['1a2b3', 'b']

为了验证器的正确工作,最好使用 ArrayAdapter 装饰器。它将验证器应用于指定的字段/字段。

$validator = ArrayAdapter([
    'columnsToValidate' => [1, 2],
    'validator' => 'digits',
]);
$processor = new FilterApplier($options, $validator);

var_dump($processor->process(['1a2b3', '123'])); // displays ['1a2b3', '321']

验证器

验证器扩展了标准库 zendframework\zend-validator

验证器列表

  • ArrayAdapter - 验证数组中的指定列

ArrayAdapter

$array1 = ['abcd', '123'];
$array2 = ['321', '123'];

$validator = new ArrayValidator([
    'columnsToValidate' => [1, 2],
    'validator' => 'digits',
]);

var_dump($validator->isValid($array1)); // false
var_dump($validator->isValid($array2)); // true

如果需要为验证器提供额外的选项,可以通过 'validatorOptions' 键传递。 有关如何使用工厂设置选项的详细信息

$validator = new ArrayValidator([
    'columnsToValidate' => [1, 2],
    'validator' => 'inArray',
    'validatorOptions' => [
        'haystack' => $array2
    ],
]);

var_dump($validator->isValid($array2)); // false

表达式语言(Expression Language)

扩展到 symfony\expression-language 库。ExpressionLanguage 组件可以编译和计算表达式。

示例

$expressionLanguage = new ExpressionLanguage();

var_dump($expressionLanguage->evaluate('1 + 2')); // displays 3
var_dump($expressionLanguage->compile('1 + 2')); // displays (1 + 2)

// Array for variables in expression
$values = [
    'a' => 2,
    'b' => 5,
];
var_dump($expressionLanguage->evaluate('a * b'), $values); // displays 10
var_dump($expressionLanguage->compile('a * b'), $values); // displays (2 * 5)

表达式函数

Callback - 提供创建带有回调的 ExpressionFunction 的功能。此类函数可以执行,但不能编译。在尝试编译使用此函数的表达式时,将抛出异常。

$callback = function($value) {
    return $value . $value;
};
$expressionFunction = new ExpressionFunction\Callback($callback, 'foo');
$expressionLanguage = new ExpressionLanguage();
$expressionLanguage->addFunction($expressionFunction);

var_dump($expressionLanguage->evaluate("foo('a')")); // displays 'aa'
var_dump($expressionLanguage->compile("foo('a')")); // exception will be thrown

表达式函数提供者

PluginExpressionFunctionProvider - 提供使用 AbstractPluginManager 创建 ExpressionFunctionProvider 的功能,指定服务列表和调用方法。

$pluginManager = new FilterPluginManager(new ServiceManager());
$services = ['digits', 'stringTrim'];
$expressionFunctionProvider = new PluginExpressionFunctionProvider($pluginManager, $services, 'filter');
$expressionLanguage = new ExpressionLanguage();
$expressionLanguage->registerProvider($expressionFunctionProvider);

var_dump($expressionLanguage->evaluate("digits('123abc')")); // displays '123'
var_dump($expressionLanguage->compile("stringTrim('   ad   ')")); //displays 'ad'

工厂

处理器、验证器和过滤器(以下称为“插件”)可以通过插件管理器创建,

$filterPluginManager = FilterPluginManager(new ServiceManager());
// Create filter using filter plugin options
$filter = $filterPluginManager->get('pregReplace', [
   'pattern' => '/aaa/',
   'replacement' => 'a',
]);

var_dump(get_class($filter)); // Zend\Filter\PregReplace

这样以及通过容器直接。

$container = new ServiceManager();
$container->setService('config', [
    'filters' => [
        'abstract_factory_config' => [
            SimpleFilterAbstractFactory::class => [
                'pregReplaceFilter' => [
                    'class' => PregReplace::class,
                    'options' => [
                        'pattern' => '/aaa/',
                        'replacement' => 'a',
                    ],
                ]
            ]
        ]
    ]
]);

$filterPluginManager = FilterPluginManager($container);
$filter = $filterPluginManager->get('pregReplace');

var_dump(get_class($filter)); // Zend\Filter\PregReplace

如果为插件配置了设置,并且是通过容器配置和通过插件管理器创建时的 $options,则它们不应冲突,否则会抛出异常。

$container = new ServiceManager();
$container->setService('config', [
    'filters' => [
        'abstract_factory_config' => [
            SimpleFilterAbstractFactory::class => [
                'pregReplaceFilter' => [
                    'class' => PregReplace::class,
                    'options' => [
                        'pattern' => '/aaa/',
                        'replacement' => 'a',
                    ],
                ]
            ]
        ]
    ]
]);
$filterPluginManager = FilterPluginManager($container);

// Will be thrown exception
$filter = $filterPluginManager->get('pregReplace', [
   'pattern' => '/aaa/',
   'replacement' => 'a',
]);

处理器示例

https://github.com/oblikov/rollun-service-formula