indigophp / ruler
用于定义逻辑规则和条件结果的库
Requires
- php: >=5.4
Requires (Dev)
- codeception/codeception: ~2.0
- codeception/mockery-module: dev-master
This package is auto-updated.
Last update: 2021-11-24 09:10:51 UTC
README
用于处理逻辑规则并根据规则结果应用结果的库。
安装
通过Composer
$ composer require indigophp/ruler
用法
此包包含 Rule(规则)、Assertion(断言)、Result(结果)、Modifier(修饰器)、RuleSet(规则集)和一个 Processor(处理器)。
主要过程围绕 Processor 展开。它负责接收一个 Context(上下文)和一个 Target(目标),确定哪些规则集是有效的,并应用它们的结果。Processor 接收一个 Context 并将其应用于规则。如果规则通过,则将 Modifier 应用到 Target 上以修改其一个或多个属性。
Context 是正在检查的数据,而 Target 是正在修改的数据,它通过引用传递。两者都可以是数组、对象或任何你想要的东西,并且两者可以是同一件事。
Processor 期望接收一个或多个 RuleSet。一个 RuleSet 是一个单一的 Rule 和一个或多个 Modifiers 的组合。
Rule 与 Assertion 结合,对 Context 执行逻辑断言。规则应能够从 Context 中选择数据,然后应将 Assertion 应用到此数据上,以返回一个布尔值以指示成功或失败。
Result 应修改 Target 内的数据。它们在功能上与 Rule 类似,它们选择数据并将其传递给 Modifier,然后应用结果。
为什么这一切如此复杂
虽然整个过程可能看起来很复杂,但它允许在创建用户构建的规则时具有很大的灵活性。规则和结果允许用户精确地定位单个数据点,并定义如何检查和修改它。
构建器
可以使用 Builder 类快速从数组结构中创建规则集。这首先需要设置各种库,以便 Builder 可以为您创建所需的类。
数组的格式表示见此处。
管理器
可以使用 Manager 类跟踪 Builder 所需的多个库集合。与 DIC 解决方案结合使用时,这可以为您提供一种轻松管理多个规则“环境”的方法。
例如,如果您使用逻辑处理器处理产品促销和税收的规则,您可能希望为两者使用不同的规则和结果。使用 Manager 类,您可以分别为它们设置环境,以便能够快速为两者创建规则集。
添加新环境通过Manager::addEnvironment()方法实现,该方法需要一个名称和为每个所需的库(规则、断言、结果和修饰符)提供的四个“事物”。“事物”可以是数组、字符串或可调用的。
如果传入的是数组或ArrayAccess,则会创建一个新的库对象,并使用AbstractLibrary::add()方法,以数组键作为名称填充数组中的值。
如果传入的“事物”是可调用的,则期望它返回一个LibraryInterface实例。
最后,如果上述条件都不满足,则将值视为字符串类名,并且Manager将尝试将其构建为新的对象,并将空值传递给构造函数。
测试
$ phpspec run
贡献
有关详细信息,请参阅贡献指南。
鸣谢
基于Steve West的工作(原始名称:LogicProcessor)。
许可协议
MIT许可协议(MIT)。有关更多信息,请参阅许可文件。
最初由Ve Interactive根据MIT许可协议授权。