الفكرة المركزية للمواصفات هي فصل بيان كيفية مطابقة المرشح عن الكائن المرشح الذي تتم مطابقته معه.
المواصفات، شرحها إريك إيفانز ومارتن فاولر
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 لك.
هذه المكتبة تحت ترخيص معهد ماساتشوستس للتكنولوجيا.