niro / kphoen-rulerz

Specification模式的强大实现

资助包维护!
Patreon

0.21.3 2022-03-31 18:57 UTC

README

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

由Eric Evans和Martin Fowler解释的Specification,请参阅这里

RulerZ是PHP实现的Specification模式,重点在于三个主要方面:

  • 定义业务规则和规格的简单且数据无关的领域特定语言(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许可证的约束。