La idea central de la Especificación es separar la declaración de cómo hacer coincidir un candidato del objeto candidato con el que se compara.
Especificaciones, explicadas por Eric Evans y Martin Fowler
RulerZ es una implementación PHP del patrón Especificación que pone énfasis en tres aspectos principales:
Las reglas comerciales se pueden escribir como texto usando un lenguaje dedicado, muy cercano a SQL, en cuyo caso nos referimos a ellas como reglas o se pueden encapsular en clases individuales y denominarlas especificaciones .
Una vez escrita una regla (o una especificación), se puede utilizar para comprobar si un único candidato la satisface o directamente para consultar una fuente de datos.
Las siguientes fuentes de datos son compatibles de forma nativa:
Y el soporte para cada uno de ellos lo proporciona una biblioteca adicional:
Característica excelente: cuando se trabaja con Doctrine, Pomm o Elasticsearch, RulerZ puede convertir reglas directamente en consultas y no necesita recuperar datos de antemano.
En primer lugar, puede expresar las reglas comerciales en un lenguaje sencillo y específico. Luego, estas reglas de negocio pueden encapsularse en clases de especificación, reutilizarse y componerse para formar reglas más complejas. Las especificaciones ahora son reutilizables y comprobables . Y por si fuera poco, estas reglas se pueden utilizar tanto para comprobar si un candidato la cumple como para filtrar cualquier fuente de datos .
Si aún necesitas que te convenzan, puedes leer el razonamiento completo en este artículo.
Como descripción general rápida, proponemos ver un pequeño ejemplo que manipula una regla simple y varias fuentes de datos.
La regla siguiente describe una " jugadora de alto rango " (básicamente, una jugadora que tiene más de 9000 puntos).
$ highRankFemalesRule = ' gender = "F" and points > 9000 ' ;
Contamos con las siguientes fuentes de datos:
// 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 ),
];
Para cualquiera de nuestras fuentes de datos, recuperar los resultados es tan simple como llamar al método 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 );
Dado un candidato, comprobar si satisface una regla se reduce a llamar al método satisfies
:
$ isHighRankFemale = $ rulerz -> satisfies ( $ playersObj [ 0 ], $ highRankFemalesRule );
Consulte la documentación para descubrir qué puede hacer RulerZ por usted.
Esta biblioteca está bajo la licencia MIT.