规则引擎RulerZ用法及实现原理解读

包下载地址:https://github.com/K-Phoen/rulerz

composer安装:composer require 'kphoen/rulerz'

使用:

use RulerZ\Compiler\Compiler;
use RulerZ\RulerZ;
use RulerZ\Target\Native\Native;

 public function getRulerZChecker()
    {
        $compiler = Compiler::create();
        $rulerz = new RulerZ($compiler, [
            new Native([
                'length' => 'strlen'
            ],[
                'contains' => function ($a, $b) {
                    return sprintf('strstr(%s, %s)', $a, $b);
                }
            ])
        ]);

        return $rulerz;
    }

我们需要搜索、校验的数据:

1、批量匹配,

 $datas    = [
            ['pseudo' => 'Joe', 'fullname' => 'Joe la frite', 'gender' => 'M', 'points' => 20],
            ['pseudo' => 'Moe', 'fullname' => 'Moe, from the bar!', 'gender' => 'M', 'points' => 200],
            ['pseudo' => 'hazel', 'fullname' => 'hazel, from the hazel!', 'gender' => 'M', 'points' => 100],
            ['pseudo' => 'Alice', 'fullname' => 'Alice, from... you know.', 'gender' => 'F', 'points' => 100],
            ['pseudo' => 'Alice', 'fullname' => 'Alice, from... you know.', 'gender' => 'F', 'points' => 20],
        ];
        $rule       = "gender = :gender and points > :min_points";
        $parameters = [
            'min_points' => 30,
            'gender'     => 'M',
        ];
        $rulerz     = $this->getRulerZChecker();
        $result     = iterator_to_array(
            $rulerz->filter($datas, $rule, $parameters) // the parameters can be omitted if empty
        );

最后的到的结果

array(2) {
  [0]=>
  array(4) {
    ["pseudo"]=>
    string(3) "Moe"
    ["fullname"]=>
    string(18) "Moe, from the bar!"
    ["gender"]=>
    string(1) "M"
    ["points"]=>
    int(200)
  }
  [1]=>
  array(4) {
    ["pseudo"]=>
    string(5) "hazel"
    ["fullname"]=>
    string(22) "hazel, from the hazel!"
    ["gender"]=>
    string(1) "M"
    ["points"]=>
    int(100)
  }
}

2、判断数据是否符合要求:

$rulerz->satisfies($data, $rule, $parameters);
// 返回布尔值,true表示满足

 $data    =['pseudo' => 'Moe', 'fullname' => 'Moe, from the bar!', 'gender' => 'M', 'points' => 200];
        $rule       = "gender = :gender and points > :min_points";
        $parameters = [
            'min_points' => 30,
            'gender'     => 'M',
        ];
        $rulerz     = $this->getRulerZChecker();
        $result     = $rulerz->satisfies($data, $rule, $parameters);//bool(true)

上文中contains表示的是用系统函数strstr()来判断$a中是否包含$b字符,由于编译后的代码是通过字符串生成的,所以你在这个匿名函数中必须要用字符串表达判断逻辑,这也是其缺点之一。

猜你喜欢

转载自blog.csdn.net/qq_38234594/article/details/88570175