xdimedrolx / hoa-ruler
Hiqdev Hoa\Ruler 库。
Requires
- php: >=7.4
- hoa/consistency: ~1.0
- hoa/exception: ~1.0
- hoa/visitor: ~2.0
- xdimedrolx/hoa-compiler: ^1.0
- xdimedrolx/hoa-file: ^1.0
- xdimedrolx/hoa-protocol: ^1.0
Requires (Dev)
- hoa/test: ~2.0
- phpunit/phpunit: ^9.5
Replaces
- hoa/ruler: ~2.0
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
有关更多信息,请参阅贡献指南。
快速使用
作为快速概述,我们建议查看一个简单的示例,该示例使用简单上下文操作简单规则。然后,我们将在规则中添加一个新的运算符。最后,我们将看到如何将规则保存到数据库中。
三步
因此,首先,我们创建一个包含两个变量: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
键关联的值。它作为哈希表(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中过滤测试结果。