L'idée centrale de la spécification est de séparer l'énoncé indiquant comment faire correspondre un candidat de l'objet candidat auquel il est comparé.
Spécifications, expliquées par Eric Evans et Martin Fowler
RulerZ est une implémentation PHP du modèle Spécification qui met l'accent sur trois aspects principaux :
Les règles métier peuvent être écrites sous forme de texte en utilisant un langage dédié, très proche de SQL, auquel cas nous les appelons règles ou elles peuvent être encapsulées dans des classes uniques et appelées spécifications .
Une fois qu'une règle (ou une spécification) est écrite, elle peut être utilisée pour vérifier si un seul candidat la satisfait ou directement pour interroger une source de données.
Les sources de données suivantes sont prises en charge de manière native :
Et la prise en charge de chacun d’entre eux est assurée par une bibliothèque supplémentaire :
Fonctionnalité qui tue : lorsque vous travaillez avec Doctrine, Pomm ou Elasticsearch, RulerZ est capable de convertir les règles directement en requêtes et n'a pas besoin de récupérer les données au préalable.
Tout d’abord, vous exprimez les règles métier dans un langage simple et dédié. Ces règles métier peuvent ensuite être encapsulées dans des classes de spécifications, réutilisées et composées pour former des règles plus complexes. Les spécifications sont désormais réutilisables et testables . Et enfin, ces règles peuvent être utilisées à la fois pour vérifier si un candidat y satisfait et pour filtrer n'importe quelle source de données .
Si vous avez encore besoin d’être convaincu, vous pouvez lire l’intégralité du raisonnement dans cet article.
Pour un aperçu rapide, nous proposons de voir un petit exemple qui manipule une règle simple et plusieurs sources de données.
La règle ci-après décrit une « joueuse de haut rang » (en gros, une joueuse ayant plus de 9000 points).
$ highRankFemalesRule = ' gender = "F" and points > 9000 ' ;
Nous disposons des sources de données suivantes :
// 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 ),
];
Pour n’importe laquelle de nos sources de données, récupérer les résultats est aussi simple que d’appeler la méthode 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 );
Étant donné un candidat, vérifier s’il satisfait à une règle revient à appeler la méthode satisfies
:
$ isHighRankFemale = $ rulerz -> satisfies ( $ playersObj [ 0 ], $ highRankFemalesRule );
Consultez la documentation pour découvrir ce que RulerZ peut faire pour vous.
Cette bibliothèque est sous licence MIT.