nicoswd / symfony-rule-engine-bundle
Symfony 规则引擎 Bundle - 解析和评估以JavaScript语法编写的规则
v1.6.2
2018-04-27 10:52 UTC
Requires
- nicoswd/php-rule-parser: ^0.5.6
Requires (Dev)
- mockery/mockery: ^1.0
- phpunit/phpunit: ^5.4.0|^6.0
README
此软件包捆绑了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)