hiqdev / hoa-ruler
Hiqdev Hoa\Ruler 库。
Requires
- php: >=7.4
- hoa/compiler: ~3.0
- hoa/consistency: ~1.0
- hoa/exception: ~1.0
- hoa/file: ~1.0
- hoa/protocol: ~1.0
- hoa/visitor: ~2.0
Requires (Dev)
- hoa/test: ~2.0
- phpunit/phpunit: ^9.5
Replaces
- hoa/ruler: ~2.0
This package is auto-updated.
Last update: 2024-09-06 13:05:35 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
有关更多信息,请参阅贡献者指南。
快速使用
作为一个快速概述,我们建议查看一个非常简单的示例,该示例使用一个简单的上下文来操作一个简单的规则。之后,我们将在规则中添加一个新的操作符。最后,我们将查看如何在数据库中保存规则。
三步
所以首先,我们创建一个包含两个变量的上下文:group
和 points
,然后断言一个规则。上下文持有值以具体化一个规则。值也可以是可调用的结果。因此
$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
变量具体化时,创建了两个新的变量,group
和 points
)。此外,我们将创建一个新的操作符/函数,称为 logged
。操作符和函数之间没有区别,除了操作符有两个操作数(因此参数)之外。
添加操作符和函数
目前,我们有以下默认操作符/函数:and
、or
、xor
、not
、=
(is
作为别名)、!=
、>
、>=
、<
、<=
、in
和 sum
。我们可以通过不同的方式添加自己的。以下是一个简单且易变的示例。因此
// 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。
获取帮助
主要有两种获取帮助的方式
- 在
#hoaproject
IRC频道上, - 在users.hoa-project.net的论坛上。
贡献
你想贡献吗?谢谢!详细的贡献指南解释了你需要知道的一切。
许可
Hoa遵循新BSD许可(BSD-3-Clause)。请参阅LICENSE
以获取详细信息。
相关项目
以下项目正在使用此库
- RulerZ,PHP中规范模式的强大实现,
- ownCloud,所有数据的安全家园,
- PhpMetrics,PHP静态分析工具,
hiqdev/php-billing
,PHP计费库atoum/ruler-extension
,此扩展允许在atoum中过滤测试结果。