Die zentrale Idee der Spezifikation besteht darin, die Aussage, wie ein Kandidat abgeglichen werden soll, von dem Kandidatenobjekt zu trennen, mit dem er abgeglichen wird.
Spezifikationen, erklärt von Eric Evans und Martin Fowler
RulerZ ist eine PHP-Implementierung des Spezifikationsmusters , die den Schwerpunkt auf drei Hauptaspekte legt:
Geschäftsregeln können als Text in einer speziellen Sprache geschrieben werden, die SQL sehr nahe kommt. In diesem Fall bezeichnen wir sie als Regeln , oder sie können in einzelne Klassen gekapselt und als Spezifikationen bezeichnet werden.
Sobald eine Regel (oder eine Spezifikation) geschrieben ist, kann sie verwendet werden, um zu prüfen, ob ein einzelner Kandidat sie erfüllt, oder um direkt eine Datenquelle abzufragen.
Die folgenden Datenquellen werden nativ unterstützt:
Und jede davon wird von einer zusätzlichen Bibliothek unterstützt:
Killer-Feature: Bei der Arbeit mit Doctrine, Pomm oder Elasticsearch ist RulerZ in der Lage, Regeln direkt in Abfragen umzuwandeln und muss nicht vorher Daten abrufen.
Zunächst einmal können Sie Geschäftsregeln in einer speziellen, einfachen Sprache ausdrücken. Anschließend können diese Geschäftsregeln in Spezifikationsklassen gekapselt , wiederverwendet und zu komplexeren Regeln zusammengestellt werden. Spezifikationen sind jetzt wiederverwendbar und testbar . Und nicht zuletzt können diese Regeln sowohl zur Überprüfung, ob ein Kandidat diese Anforderungen erfüllt, als auch zum Filtern beliebiger Datenquellen verwendet werden.
Wenn Sie noch verurteilt werden müssen, können Sie die gesamte Begründung in diesem Artikel lesen.
Als schnellen Überblick schlagen wir vor, ein kleines Beispiel zu sehen, das eine einfache Regel und mehrere Datenquellen manipuliert.
Die nachfolgende Regel beschreibt eine „ hochrangige Spielerin “ (im Grunde eine Spielerin mit mehr als 9000 Punkten).
$ highRankFemalesRule = ' gender = "F" and points > 9000 ' ;
Wir verfügen über folgende Datenquellen:
// 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 ),
];
Für jede unserer Datenquellen ist das Abrufen der Ergebnisse so einfach wie das Aufrufen der 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 );
Bei einem gegebenen Kandidaten läuft die Prüfung, ob er eine Regel erfüllt, darauf hinaus, die satisfies
-Methode aufzurufen:
$ isHighRankFemale = $ rulerz -> satisfies ( $ playersObj [ 0 ], $ highRankFemalesRule );
Sehen Sie sich die Dokumentation an, um herauszufinden, was RulerZ für Sie tun kann.
Diese Bibliothek steht unter der MIT-Lizenz.