trunglv/ruler

The Hoa\Ruler 库。 [trunglv/Maintenance]

2.17.05.16 2017-05-16 07:52 UTC

README

Hoa

Build status Code coverage Packagist License

Hoa 是一套 模块化可扩展结构化 的 PHP 库。
此外,Hoa 旨在成为工业和科研世界之间的桥梁。

Hoa\Ruler

Help on IRC Help on Gitter Documentation Board

此库允许操作规则引擎。规则可以使用专用语言编写,非常接近 SQL。因此,它们可以由用户编写并保存在数据库中。

例如,这些规则对需要操作用户编写的促销或特别优惠规则的商业解决方案非常有用。参见 维基百科

业务规则引擎是一个软件系统,它在运行时生产环境中执行一个或多个业务规则。这些规则可能来自法律法规(“员工可以因为任何原因或没有原因被解雇,但不能因为非法原因被解雇”),公司政策(“所有一次性消费超过 100 美元的客户将获得 10% 的折扣”)或其他来源。业务规则系统使这些公司政策和其他运营决策能够与应用程序代码分开定义、测试、执行和维护。

了解更多.

安装

使用 Composer,要将此库添加到依赖项中,您需要要求 hoa/ruler

$ composer require hoa/ruler '~2.0'

有关更多安装说明,请参阅 源代码页面

测试

在运行测试套件之前,必须安装开发依赖项

$ composer install

然后,运行所有测试套件

$ vendor/bin/hoa test:run

有关更多信息,请参阅 贡献者指南

快速使用

作为一个快速概述,我们建议您查看一个操作简单规则和简单上下文的简单示例。然后,我们将在规则中添加一个新的运算符。最后,我们将看到如何将规则保存在数据库中。

三步

所以首先,我们创建一个包含两个变量:grouppoints 的上下文,然后断言一个规则。上下文包含用于具体化规则的值。值也可以是可调用的结果。因此

$ruler = new Hoa\Ruler\Ruler();

// 1. Write a rule.
$rule  = 'group in ["customer", "guest"] and points > 30';

// 2. Create a context.
$context           = new Hoa\Ruler\Context();
$context['group']  = 'customer';
$context['points'] = function () {
    return 42;
};

// 3. Assert!
var_dump(
    $ruler->assert($rule, $context)
);

/**
 * Will output:
 *     bool(true)
 */

在下一个示例中,我们有一个 User 对象和一个动态填充的上下文(当 user 变量具体化时,创建了两个新变量 grouppoints)。此外,我们将创建一个名为 logged 的新运算符/函数。运算符和函数之间没有区别,除了运算符有两个操作数(因此是参数)之外。

添加运算符和函数

目前,我们有以下默认运算符/函数:andorxornot=is 作为别名)、!=>>=<<=insum。我们可以通过不同的方式添加自己的运算符。以下是一个简单且易变的示例。因此

// The User object.
class User
{
    const DISCONNECTED = 0;
    const CONNECTED    = 1;

    public $group      = 'customer';
    public $points     = 42;
    protected $_status = 1;

    public function getStatus()
    {
        return $this->_status;
    }
}

$ruler = new Hoa\Ruler\Ruler();

// New rule.
$rule  = 'logged(user) and group in ["customer", "guest"] and points > 30';

// New context.
$context         = new Hoa\Ruler\Context();
$context['user'] = function () use ($context) {
    $user              = new User();
    $context['group']  = $user->group;
    $context['points'] = $user->points;

    return $user;
};

// We add the logged() operator.
$ruler->getDefaultAsserter()->setOperator('logged', function (User $user) {
    return $user::CONNECTED === $user->getStatus();
});

// Finally, we assert the rule.
var_dump(
    $ruler->assert($rule, $context)
);

/**
 * Will output:
 *     bool(true)
 */

此外,如果上下文中的变量是一个数组,我们可以使用与PHP相同的语法访问其值。例如,如果a变量是一个数组,我们可以写a[0]来访问与0键关联的值。它像一个hashmap(PHP数组实现),所以我们可以有字符串等作为键。同样,如果一个变量是对象,我们可以在它上面调用方法。例如,如果a变量是一个数组,其中第一个键的值是一个具有foo方法的对象,我们可以写:a[0].foo(b),其中b是上下文中的另一个变量。此外,我们还可以访问对象的公共属性。显然,我们可以混合数组和对象的访问。请参阅语法(hoa://Library/Ruler/Grammar.pp)以查看所有可能的构造。

保存规则

现在,我们有两种保存规则的方法,例如,在数据库中。要么我们直接将规则保存为字符串,要么我们保存规则的序列化形式,这将避免进一步的解释。在下一个示例中,我们将看到如何使用Hoa\Ruler\Ruler::interpret静态方法序列化和反序列化规则。

$database->save(
    serialize(
        Hoa\Ruler\Ruler::interpret(
            'logged(user) and group in ["customer", "guest"] and points > 30'
        )
    )
);

对于后续执行

$rule = unserialize($database->read());
var_dump(
    $ruler->assert($rule, $context)
);

当一个规则被解释时,它的对象模型被创建。我们序列化和反序列化这个模型。要查看创建此类模型所需的PHP代码,我们可以打印模型本身(作为一个例子)。因此

echo Hoa\Ruler\Ruler::interpret(
    'logged(user) and group in ["customer", "guest"] and points > 30'
);

/**
 * Will output:
 *     $model = new \Hoa\Ruler\Model();
 *     $model->expression =
 *         $model->and(
 *             $model->func(
 *                 'logged',
 *                 $model->variable('user')
 *             ),
 *             $model->and(
 *                 $model->in(
 *                     $model->variable('group'),
 *                     [
 *                         'customer',
 *                         'guest'
 *                     ]
 *                 ),
 *                 $model->{'>'}(
 *                     $model->variable('points'),
 *                     30
 *                 )
 *             )
 *         );
 */

祝您玩得开心!

文档

《Hoa\Ruler》黑客手册包含了有关如何使用此库及其工作原理的详细信息。

要本地生成文档,请执行以下命令

$ composer require --dev hoa/devtools
$ vendor/bin/hoa devtools:documentation --open

更多文档可以在项目的网站上找到:hoa-project.net

获取帮助

主要有两种获取帮助的方式

贡献

你想贡献吗?谢谢!详细的贡献指南解释了你需要知道的一切。

许可证

Hoa遵循新BSD许可证(BSD-3-Clause)。请参阅LICENSE以获取详细信息。

相关项目

以下项目正在使用此库