A ideia central da Especificação é separar a declaração de como combinar um candidato do objeto candidato com o qual ele é comparado.
Especificações, explicadas por Eric Evans e Martin Fowler
RulerZ é uma implementação PHP do padrão de especificação que enfatiza três aspectos principais:
As regras de negócios podem ser escritas como texto usando uma linguagem dedicada, muito próxima do SQL, caso em que nos referimos a elas como regras ou podem ser encapsuladas em classes únicas e chamadas de especificações .
Depois que uma regra (ou especificação) é escrita, ela pode ser usada para verificar se um único candidato a satisfaz ou diretamente para consultar uma fonte de dados.
As seguintes fontes de dados são suportadas nativamente:
E o suporte para cada um deles é fornecido por uma biblioteca adicional:
Recurso matador: ao trabalhar com Doctrine, Pomm ou Elasticsearch, o RulerZ é capaz de converter regras diretamente em consultas e não precisa buscar dados previamente.
Em primeiro lugar, você consegue expressar regras de negócios em uma linguagem simples e dedicada. Então, essas regras de negócio podem ser encapsuladas em classes de especificação, reutilizadas e compostas para formar regras mais complexas. As especificações agora são reutilizáveis e testáveis . E por último, mas não menos importante, essas regras podem ser usadas tanto para verificar se um candidato o satisfaz quanto para filtrar qualquer fonte de dados .
Se ainda precisar ser convencido, você pode ler todo o raciocínio neste artigo.
Como uma rápida visão geral, propomos ver um pequeno exemplo que manipula uma regra simples e diversas fontes de dados.
A regra a seguir descreve uma " jogadora com classificação elevada " (basicamente, uma jogadora com mais de 9.000 pontos).
$ highRankFemalesRule = ' gender = "F" and points > 9000 ' ;
Temos as seguintes fontes de dados:
// 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 qualquer fonte de dados, recuperar os resultados é tão simples quanto chamar o 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 um candidato, verificar se ele satisfaz uma regra se resume a chamar o método satisfies
:
$ isHighRankFemale = $ rulerz -> satisfies ( $ playersObj [ 0 ], $ highRankFemalesRule );
Confira a documentação para descobrir o que o RulerZ pode fazer por você.
Esta biblioteca está sob licença do MIT.