wallabag/rulerz

规范模式的强大实现

资助包维护!
Patreon

dev-master / 1.0.x-dev 2023-12-24 00:53 UTC

This package is auto-updated.

Last update: 2024-08-24 02:35:48 UTC


README

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

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

规范模式,由Eric Evans和Martin Fowler解释

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

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

简介

业务规则可以使用专用语言以文本形式编写,类似于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许可证的约束。