xdimedrolx/hoa-ruler

Hiqdev Hoa\Ruler 库。

1.1.3 2022-12-02 16:21 UTC

This package is auto-updated.

Last update: 2024-08-30 01:32:27 UTC


README

Hoa 项目已被归档,不接受合并请求提供的升级或补丁。

HOA 包包含一些为 PHP 8.0 和 PHP 8.1 废弃的代码,但我们需要这些包才能在现代 PHP 版本上运行。

从哪里变更?

更改主要影响了方法声明中的返回数据类型提示,未初始化属性的访问。

如何使用

我们目前已分叉以下包,主要是为了让 hoa/ruler 与 PHP 8.1 兼容

您可以直接在 composer.json 中将 hoa 包的要求替换为相应的分叉包:无需更改代码库中的任何内容。

如果您使用的是需要 hoa 的某个人的包,只需将分叉添加到您的项目根 composer.json:我们已将分叉标记为替代品,因此 composer 将安装它们而不是原始包。

版本

我们从最新的 hoa 包版本分叉,并从 1.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 键关联的值。它作为哈希表(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以获取详细信息。

相关项目

以下项目正在使用此库