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许可协议授权。