kmuenkel/rule-evaluator

检查给定的数据集是否与递归规则集相符

v1.0.0 2020-02-04 18:30 UTC

This package is auto-updated.

Last update: 2024-09-06 03:36:37 UTC


README

检查给定的数据集是否与递归规则集相符

您从一个可能来自数据库的配置数组开始。每个“规则”只有三个数据点。

  • 第一个值
  • 比较运算符
  • 第二个值

第一个和第二个值的键名表示这些值的性质。

  • reference1/reference2 表示内容将具有对正在评估的数据数组中的数据点的点符号引用。
  • value1/value2 预期将包含一个静态值,应按字面值处理。
  • child1/child2 表示“值”将是嵌套“规则”的布尔结果。

通过点符号引用和对“子”规则的支持,数据和条件都支持无限复杂性。但由于这是一个平面的3点“规则”记录,这使得通过数据库而不是配置文件来管理规则更有利。虽然这样的解析器还不存在,但您只需确保您的 DBParser 类实现了与当前 ConfigParser 相同的 Parser 接口。

键为 comparator 的比较运算符可以是以下任何一种

  • '==': 值1等于值2
  • '===': 值1严格等于值2
  • '!=': 值1不等于值2
  • '!==': 值1严格不等于值2
  • '>': 值1大于值2
  • '<': 值1小于值2
  • 'in': 值1可以在定义为值2的数组中找到
  • 'not in': 值1不能在定义为值2的数组中找到
  • 'and': 值1和值2必须解析为 true
  • '&&': 与 'and' 相同
  • 'or': 值1或值2必须解析为 true
  • '||': 与 'or' 相同
  • 'regex': 值1与值2定义的模式匹配
  • 'all'
    • 定义为值1的数组中的所有元素都必须在定义为值2的数组中找到
    • 或者 如果只有一个数组存在,它必须引用所有解析为 true 的嵌套规则
  • 'any'
    • 定义为值1的数组中找到的任何元素都必须在定义为值2的数组中找到
    • 或者 如果只有一个数组存在,它必须引用至少一个解析为 true 的嵌套规则
  • 'none'
    • 定义为值1的数组中没有任何元素可以存在于定义为值2的数组中
    • 或者 如果只有一个数组存在,它必须引用所有解析为 false(或为空)的嵌套规则
  • 'passes': 值1和正在评估的整个数据集都传递给定义为值2的闭包,其输出必须解析为 true。这允许添加自定义规则行为。

示例用法

ruleConfig.php

return [
    'isKevin' => [
        'reference1' => 'name.first',
        'comparator' => '==',
        'value2' => 'Kevin'
    ],
    'inCarolinas' => [
        'reference1' => 'address.state',
        'comparator => 'in',
        'value2' => [
            'NC',
            'SC'
        ]
    ],
    'isMe' => [
        'comparator' => 'all',
        'value2' => [
            'isKevin',
            'inCarolinas
        ]
    ]
];

data.json

{
  "name": {
    "first": "Kevin"
  },
  "address": {
      "state": "NC"
  }
}
use Evaluator\Parsers\ConfigParser;

$rules = require_once 'ruleConfig.php';
$data = json_decode(file_get_contents("data.json"), true);
$data = array_dot($data);

$ result = (new ConfigParser($data, $rules))->evaluate('isMe'); // true