xdimedrolx/rulerz

规范模式的强大实现

支持包维护!
Patreon

0.23.4 2024-01-20 10:42 UTC

This package is auto-updated.

Last update: 2024-09-20 12:01:25 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许可证的约束。