사양의 핵심 아이디어는 후보를 일치시키는 방법에 대한 설명과 일치되는 후보 개체를 분리하는 것입니다.
Eric Evans와 Martin Fowler가 설명하는 사양
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 라이센스를 따릅니다.