nicoswd/symfony-rule-engine-bundle

Symfony 规则引擎 Bundle - 解析和评估以JavaScript语法编写的规则

v1.6.2 2018-04-27 10:52 UTC

This package is auto-updated.

Last update: 2024-09-06 09:32:57 UTC


README

build coverage Scrutinizer Code Quality Latest Stable Version

SensioLabsInsight

此软件包捆绑了nicoSWD/php-rule-parser

需要PHP >= 7.0

兼容Symfony 3和4!

安装

$ composer require nicoswd/symfony-rule-engine-bundle
<?php

// in AppKernel::registerBundles()
$bundles = [
    // ...
    new nicoSWD\RuleBundle\RuleBundle(),
    // ...
];

使用示例

<?php

$rule = '[1, 4, 3].join(glue) === "1-4-3"';
$variables = ['glue' => '-'];

$result = $this->get('rule_parser')->isTrue($rule, $variables);
var_dump($result); // bool(true)

自定义函数

自定义函数会自动发现。只需将它们配置为具有标签nico_swd.rule.function的服务即可。

如果你在同一目录中有多个函数,让它们对软件包可见的最简单方法是这样做

services.yml

AppBundle\Functions\:
    resource: '../../src/AppBundle/Functions'
    tags: ['nico_swd.rule.function']

此外,自定义函数必须实现nicoSWD\Rules\Core\CallableUserFunction,如下例所示

<?php

namespace AppBundle\Functions;

use nicoSWD\Rules\Core\CallableUserFunction;
use nicoSWD\Rules\Tokens\BaseToken;
use nicoSWD\Rules\Tokens\TokenArray;

class ArrayFilter implements CallableUserFunction
{
    /**
     * @param BaseToken $param
     * @param BaseToken $param ...
     * @return BaseToken
     */
    public function call($param = null)
    {
        // Make sure this functions only works on arrays
        if (!$param instanceof TokenArray) {
            throw new \InvalidArgumentException();
        }

        return new TokenArray(
            array_values(
                array_filter(
                    $param->toArray()
                )
            )
        );
    }

    public function getName(): string
    {
        return 'array_filter';
    }
}

这些函数可以选择性地获取nicoSWD\Rules\Tokens\BaseToken实例作为参数,并且必须始终返回一个。

<?php

$rule = 'array_filter([0, false, 1]) === [1]';

$result = $this->get('rule_parser')->isTrue($rule);
var_dump($result); // bool(true)