rulerz

Powerful implementation of the Specification pattern in PHP

Github星跟蹤圖

RulerZ Build Status Scrutinizer Code Quality

The central idea of Specification is to separate the statement of how to match
a candidate, from the candidate object that it is matched against.

Specifications, explained by Eric Evans and Martin Fowler

RulerZ is a PHP implementation of the Specification pattern which puts the
emphasis on three main aspects:

  • an easy and data-agnostic DSL
    to define business rules and specifications,
  • the ability to check if a candidate satisfies a specification,
  • the ability to filter or query any datasource to only retrieve
    candidates matching a specification.

Introduction

Business rules can be written as text using a dedicated language, very close to
SQL, in which case we refer to them as rules or they can be encapsulated in
single classes and referred to as specifications.

Once a rule (or a specification) is written, it can be used to check if a single
candidate satisfies it or directly to query a datasource.

The following datasources are supported natively:

  • array of arrays,
  • array of objects.

And support for each one of these is provided by an additional library:

Killer feature: when working with Doctrine, Pomm, or Elasticsearch, RulerZ
is able to convert rules directly in queries and does not need to fetch data
beforehand.

That's cool, but why do I need that?

First of all, you get to express business rules in a dedicated, simple
language
.
Then, these business rules can be encapsulated in specification classes, reused
and composed to form more complex rules. Specifications are now reusable and
testable.
And last but not least, these rules can be used both to check if a candidate
satisfies it and to filter any datasource.

If you still need to be conviced, you can read the whole reasoning in this
article
.

Quick usage

As a quick overview, we propose to see a little example that manipulates a
simple rule and several datasources.

1. Write a rule

The rule hereafter describes a "high ranked female player" (basically, a female
player having more than 9000 points).

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

2. Define a datasource

We have the following datasources:

// 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. Use a rule to query a datasource

For any of our datasource, retrieving the results is as simple as calling the
filter method:

// 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) Check if a candidate satisfies a rule

Given a candidate, checking if it satisfies a rule boils down to calling the
satisfies method:

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

Going further

Check out the documentation to discover what RulerZ can do for
you.

License

This library is under the MIT license.

主要指標

概覽
名稱與所有者K-Phoen/rulerz
主編程語言PHP
編程語言PHP (語言數: 4)
平台
許可證MIT License
所有者活动
創建於2015-01-28 23:52:23
推送於2022-09-02 10:05:38
最后一次提交2022-09-02 12:05:38
發布數46
最新版本名稱0.21.1 (發布於 2018-09-18 17:15:42)
第一版名稱0.1.0 (發布於 )
用户参与
星數873
關注者數45
派生數98
提交數534
已啟用問題?
問題數60
打開的問題數19
拉請求數45
打開的拉請求數7
關閉的拉請求數13
项目设置
已啟用Wiki?
已存檔?
是復刻?
已鎖定?
是鏡像?
是私有?