indigophp/ruler

此包已被废弃,不再维护。未建议替代包。

用于定义逻辑规则和条件结果的库

v0.2 2014-10-09 13:23 UTC

This package is auto-updated.

Last update: 2021-11-24 09:10:51 UTC


README

Latest Version Software License Build Status Code Coverage Quality Score HHVM Status Total Downloads Dependency Status

用于处理逻辑规则并根据规则结果应用结果的库。

安装

通过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 的组合。

RuleAssertion 结合,对 Context 执行逻辑断言。规则应能够从 Context 中选择数据,然后应将 Assertion 应用到此数据上,以返回一个布尔值以指示成功或失败。

Result 应修改 Target 内的数据。它们在功能上与 Rule 类似,它们选择数据并将其传递给 Modifier,然后应用结果。

RuleSet

处理器流程

示例代码

为什么这一切如此复杂

虽然整个过程可能看起来很复杂,但它允许在创建用户构建的规则时具有很大的灵活性。规则和结果允许用户精确地定位单个数据点,并定义如何检查和修改它。

构建器

可以使用 Builder 类快速从数组结构中创建规则集。这首先需要设置各种库,以便 Builder 可以为您创建所需的类。

数组的格式表示见此处

管理器

可以使用 Manager 类跟踪 Builder 所需的多个库集合。与 DIC 解决方案结合使用时,这可以为您提供一种轻松管理多个规则“环境”的方法。

例如,如果您使用逻辑处理器处理产品促销和税收的规则,您可能希望为两者使用不同的规则和结果。使用 Manager 类,您可以分别为它们设置环境,以便能够快速为两者创建规则集。

添加新环境通过Manager::addEnvironment()方法实现,该方法需要一个名称和为每个所需的库(规则、断言、结果和修饰符)提供的四个“事物”。“事物”可以是数组、字符串或可调用的。

如果传入的是数组或ArrayAccess,则会创建一个新的库对象,并使用AbstractLibrary::add()方法,以数组键作为名称填充数组中的值。

如果传入的“事物”是可调用的,则期望它返回一个LibraryInterface实例。

最后,如果上述条件都不满足,则将值视为字符串类名,并且Manager将尝试将其构建为新的对象,并将空值传递给构造函数。

测试

$ phpspec run

贡献

有关详细信息,请参阅贡献指南

鸣谢

基于Steve West的工作(原始名称:LogicProcessor)。

许可协议

MIT许可协议(MIT)。有关更多信息,请参阅许可文件

最初由Ve Interactive根据MIT许可协议授权。