subzeta/ruling

无状态规则引擎

v2.1 2017-12-07 14:17 UTC

This package is not auto-updated.

Last update: 2024-09-24 20:17:55 UTC


README

给定上下文断言语句的无状态规则引擎。

安装

$ composer require "subzeta/ruling" : "^2.0"

使用示例

require '/path/to/vendor/autoload.php';

use subzeta\Ruling\Ruling;

$my = new \stdClass();
$my->sensitivity = 80;
$my->joyfulness = 10;

(new Ruling())
    ->given([
        'sensitivity' => $my->sensitivity,
        'joyfulness' => $my->joyfulness
    ])->when(
        ':sensitivity is greater than 90 or :joyfulness is less than 20'
    )->then(function() {
        echo 'Hell yeah, I should listen music right now!';
    })->otherwise(function() {
        echo 'I\'m happy enough, thanks.';
    })->execute();

// Outputs: Hell yeah, I should listen music right now!

调用

有三个主要入口

interpret

返回解释后的规则。使用上面的示例,输出将是:['80 > 90 || 10 < 20']

assert

返回一个布尔值,表示输出。使用上面的示例,输出将是:true

execute

如果已定义,则触发成功或失败回调。使用上面的示例,输出将是:'Hell yeah, I should listen it!'

错误处理

当发生错误时,会抛出不同类型的异常

InvalidContextException

当提供的上下文无效时(接受:'string-key-1' => value-1, ..., 'string-key-x' => value-x)。

InvalidRuleException

当提供的规则无效时(接受:'string' 或 ['string-1', ..., 'string-x'])

InvalidCallbackException

当提供的成功/失败回调不可调用时(接受:function(){return 'Hey Ho! Let's go!';})

支持的运算符

备注

  • 对于 execute 方法,不需要提供回调,它将返回一个布尔值,就像 assert 一样。
  • 规则遵循运算符优先级,并从右到左评估括号。

测试

$ phpunit

递归待办事项列表

  • 增加单元测试的数量,以防止执行不良上下文或格式错误的规则。

待办事项

  • 改进解释方法响应。

变更列表

  • 允许别名("等于"可以写成"是","不等于"可以写成"不是"/"isn't")。
  • 上下文值也可以允许可调用的函数。
  • 添加了严格的比较运算符(相同,不同)。
  • 实现一种显示解释规则的 dump 方法可能很有趣。
  • 添加了 "in" 运算符。
  • 上下文接受数组值。

许可证

MIT