仕様の中心的な考え方は、候補を照合する方法のステートメントを、照合される候補オブジェクトから分離することです。
仕様、エリック・エヴァンスとマーティン・ファウラーによる説明
RulerZ は、次の 3 つの主要な側面に重点を置いた仕様パターンの PHP 実装です。
ビジネス ルールは、SQL に非常に近い専用言語を使用してテキストとして記述することができます。この場合、ビジネス ルールをルールと呼ぶか、単一のクラスにカプセル化して仕様と呼ぶことができます。
ルール (または仕様) を作成すると、そのルール (または仕様) を使用して、単一の候補がルールを満たすかどうかを確認したり、データソースを直接クエリしたりできます。
次のデータソースがネイティブにサポートされています。
これらのそれぞれのサポートは、追加のライブラリによって提供されます。
キラー機能: Doctrine、Pomm、または Elasticsearch を使用する場合、RulerZ はクエリ内でルールを直接変換でき、事前にデータをフェッチする必要はありません。
まず第一に、ビジネス ルールを専用のシンプルな言語で表現できるようになります。次に、これらのビジネス ルールを仕様クラスにカプセル化し、再利用して構成して、より複雑なルールを形成できます。仕様は再利用可能でテスト可能になりました。そして最後に重要なことですが、これらのルールは、候補がルールを満たしているかどうかを確認することと、データソースをフィルターすることの両方に使用できます。
それでも有罪判決を受ける必要がある場合は、この記事でその理由全体を読むことができます。
簡単な概要として、単純なルールといくつかのデータソースを操作する小さな例を見てみましょう。
以下のルールでは「上位の女性プレイヤー」(基本的に9000ポイント以上の女性プレイヤー)を指します。
$ highRankFemalesRule = ' gender = "F" and points > 9000 ' ;
次のデータソースがあります。
// a Doctrine QueryBuilder
$ playersQb = $ entityManager
-> createQueryBuilder ()
-> select ( ' p ' )
-> from ( ' EntityPlayer ' , ' 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 ),
];
どのデータソースでも、 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 );
候補が与えられた場合、それがルールを満たすかどうかをチェックすることは、結局satisfies
メソッドを呼び出すことになります。
$ isHighRankFemale = $ rulerz -> satisfies ( $ playersObj [ 0 ], $ highRankFemalesRule );
RulerZ で何ができるかを知るには、ドキュメントを参照してください。
このライブラリは MIT ライセンスの下にあります。