إطار التحقق من صحة المدخلات باسم ممل
Changelog
يعد التحقق من الإدخال مهمة مهمة في أي تطبيق ويب ، ولكنه لا يزال مهمة شاقة للغاية. هذا يحل محل الشيكات المتداخلة بهيكل بيانات مناسب يحدد بوضوح المدخلات المطلوبة والاختيارية.
يعيد تصميم التصميم حول فكرة التصميم الذي يحركه API ، حيث يكون كل نقطة نهاية API كائنها الخاص ، ومع ذلك لا يتطلب هذا التنسيق بشكل صريح
يتم تحويل الإدخال الخام إلى بيانات آمنة في خطوتين أساسيتين:
التحليل مسؤول عن تحويل سلسلة الإدخال الخام إلى صفيف ترابط. إذا تم تنظيم طلبك للقيام بذلك ، فيمكن تخطي هذه الخطوة تمامًا.
يعد التحقق من الصحة الجزء الأكثر فائدة من المكتبة - أخذ مجموعة محددة من المعلمات الاختيارية والمطلوبة وأنواعها ، ومقارنة قيم الإدخال بالمواصفات. يمنع التنفيذ البيانات غير الصالحة من نشرها بالكامل ؛ لا يمكن إنشاء كائن SafeInput (الذي سيستخدمه تطبيقك) من بيانات غير صالحة!
عند الانتهاء من هذه العملية ، يتم إرجاع كائن SafeInput الذي يحتوي على بيانات وفقًا للمواصفات المحددة بواسطة الكائن الذي يقوم بتنفيذ ValidationInterface (قيم اختيارية مفقودة فارغة).
نظرًا لأن هذه المكتبة موجودة لتوفير بيانات موثوقة ، فستمنعك بنشاط من التنقيب الثاني ؛ على سبيل المثال ، سيؤدي استخدام isset أو empty على بنية البيانات إلى إلقاء استثناء. إن تجربة المؤلف هي أن التصرف غير قادر على الوثوق ببياناتك التي تم التحقق من صحتها هي عبارة عن رائحة مضادة للرمز. إذا أصرت على القيام بذلك ، فهذه ليست الأداة المناسبة لك. إجبار الثقة مثل هذا يميل إلى منع التوثيق من الالتقاط عن الواقع.
يتبع مثال أساسي:
some_controller_file.php
<?php
// This would be in its own file
use Firehed Input Interfaces ValidationInterface ;
use Firehed Input Containers SafeInput ;
use Firehed Input Objects as O ;
class Endpoint
implements ValidationInterface {
public function getOptionalInputs () {
return [
' bar ' => new O Text (),
' baz ' => ( new O Text ())-> setDefaultValue ( ' my baz ' ),
];
}
public function getRequiredInputs () {
return [
' foo ' => new O Text (),
];
}
public function execute ( SafeInput $ i ) {
// ... do some magic
// $i['foo'] will be a string
// $i['bar'] will be a string or null, since it was optional
// $i['baz'] will be a string or 'my baz', since it was an optional with a default value
}
} index.php
<?php
// This is the core of your Front Controller
use Firehed Input Containers RawInput ;
use Firehed Input Parsers URLEncoded ;
// The endpoint should be detrmined by your router
$ endpoint = new Endpoint ();
// The parser should be determined by the Content-Type header
$ parser = new URLEncoded ();
try {
$ input = ( new RawInput ( " foo=world " ))
-> parse ( $ parser )
-> validate ( $ endpoint );
$ endpoint -> execute ( $ input );
} catch ( Firehed Input Exceptions InputException $ e ) {
// The input contained invalid data
} catch ( Exception $ e ) {
// Do any logging, error responses, etc.
echo $ e ;
}