Основная идея спецификации состоит в том, чтобы отделить утверждение о том, как сопоставить кандидата, от объекта-кандидата, с которым он сопоставляется.
Технические характеристики, объясненные Эриком Эвансом и Мартином Фаулером.
RulerZ — это 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.