kphoen/rulerz

规范模式的强大实现

资助包维护!
Patreon

安装数: 1,176,543

依赖项: 13

建议者: 0

安全性: 0

星标: 872

关注者: 47

分支: 96

公开问题: 27

0.21.1 2018-09-18 15:15 UTC

README

⚠️ 此项目不再维护,如果您有兴趣成为维护者,请与我联系 ⚠️

规范模式的核心思想是将如何匹配候选者的声明与被匹配的候选对象分离。

规范,由Eric Evans和Martin Fowler解释

RulerZ是规范模式的PHP实现,强调以下三个主要方面:

  • 定义业务规则和规范的简单且数据无关的领域特定语言(DSL)
  • 检查候选者是否满足规范的能力,
  • 过滤或查询任何数据源以仅检索符合规范候选者的能力。

介绍

业务规则可以使用专用语言以文本形式编写,非常类似于SQL,在这种情况下,我们称之为“规则”或将其封装在单个类中并称为“规范”。

一旦编写了规则(或规范),就可以用它来检查单个候选者是否满足它或直接查询数据源。

以下数据源受原生支持:

  • 数组数组,
  • 对象数组。

并且每个这些数据源的支持都由一个额外的库提供

杀手级功能:当与Doctrine、Pomm或Elasticsearch一起工作时,RulerZ能够直接在查询中转换规则,无需事先获取数据。

这很酷,但我为什么需要它呢?

首先,您可以使用专用、简单的语言表达业务规则。然后,这些业务规则可以封装在规范类中,可重用和组合以形成更复杂的规则。规范现在是可重用和可测试的。最后但同样重要的是,这些规则既可以用来检查候选者是否满足它,也可以用来过滤任何数据源。

如果您仍然需要被说服,您可以在这篇文章中阅读整个推理过程。

快速使用

为了快速了解,我们建议您查看一个示例,该示例通过操作一个简单规则和几个数据源。

1. 编写规则

下面的规则描述了一个“高排名的女性玩家”(基本上,是指得分超过9000分的女性玩家)。

$highRankFemalesRule = 'gender = "F" and points > 9000';

2. 定义数据源

我们有以下数据源

// a Doctrine QueryBuilder
$playersQb = $entityManager
    ->createQueryBuilder()
    ->select('p')
    ->from('Entity\Player', 'p');

// or an array of arrays
$playersArr = [
    ['pseudo' => 'Joe',   'gender' => 'M', 'points' => 2500],
    ['pseudo' => 'Moe',   'gender' => 'M', 'points' => 1230],
    ['pseudo' => 'Alice', 'gender' => 'F', 'points' => 9001],
];

// or an array of objects
$playersObj = [
    new Player('Joe',   'M', 40, 2500),
    new Player('Moe',   'M', 55, 1230),
    new Player('Alice', 'F', 27, 9001),
];

3. 使用规则查询数据源

对于我们的任何一个数据源,获取结果就像调用filter方法一样简单。

// converts the rule in DQL and makes a single query to the DB
$highRankFemales = $rulerz->filter($playersQb, $highRankFemalesRule);
// filters the array of arrays
$highRankFemales = $rulerz->filter($playersArr, $highRankFemalesRule);
// filters the array of objects
$highRankFemales = $rulerz->filter($playersObj, $highRankFemalesRule);

3. (bis) 检查候选者是否满足规则

给定一个候选者,检查它是否满足规则只需调用satisfies方法。

$isHighRankFemale = $rulerz->satisfies($playersObj[0], $highRankFemalesRule);

进一步了解

查看文档,了解RulerZ能为您做什么。

许可协议

本库遵循MIT许可协议。