PHP / متقدم: النماذج الموثوقة وأدلة التشغيل / الدرس 17
حدود HTTP وJSON API القابلة للصيانة
ركّب التحليل والتصريح والمجال والحفظ والاستجابة دون إطار. استخدم محولات وعقود خطأ صريحة بدلاً من ربط القواعد بالعامات الفائقة.
في هذه الصفحة
أهداف الدرس
- فحص صياغة JSON وبنية المجال منفصلتين.
- فصل المحولات والخدمات وقواعد المجال.
- تحديد الحالة وعدم مضاعفة الأثر وحدود الدليل.
اختيار حدود قليلة واضحة
يمكن فصل الفك والإذن والتنسيق والمجال والحفظ والإرسال دون Laravel. الفائدة وضوح الملكية لا عدد المجلدات. تقبل القواعد قيماً صالحة وتعاد نتائج بلا $_POST أو ترويسات. تملك الخدمة المعاملة والمحولات ويربط HTTP النتائج بالحالة والتمثيل. تجنب حاوية عامة بكل دالة تخفي الاعتماد وتطلب إعداداً غير مرتبط للاختبار.
صياغة JSON ليست مخطط المجال
يجعل JSON_THROW_ON_ERROR المشوه صريحاً لكن قد ينجح إلى null أو قائمة أو أنواع خاطئة. تحقق قبل المجال وميّز الغائب وnull والممنوع وحدد المجهول. يطلب المثال سجلاً بعنوان غير فارغ ومقاعد صحيحة غير سالبة من نص مصطنع بلا طلب أو قاعدة. ويحتاج الحقيقي الحجم والنوع والإذن التي لا يثبتها الفاك المحلي.
<?php
declare(strict_types=1);
function decodeCourse(string $json): array {
$data = json_decode($json, true, 512, JSON_THROW_ON_ERROR);
if (!is_array($data) || !isset($data["title"], $data["seats"]) ||
!is_string($data["title"]) || trim($data["title"]) === "" ||
!is_int($data["seats"]) || $data["seats"] < 0) {
throw new InvalidArgumentException("invalid course shape");
}
return ["title" => trim($data["title"]), "seats" => $data["seats"]];
}
$course = decodeCourse('{"title":" PHP ","seats":2}');
echo $course["title"], " ", $course["seats"], PHP_EOL;
PHP 2
يحوي المعاد الحقول المختارة الصالحة فقط؛ ولا يضمنها JSON الصحيح وحده.
الحالة وشكل الخطأ عقدان للمستدعي
عرّف المشوه والمجال والخلو من المصادقة والمنع والغياب والتعارض وغير المتوقع. تخفي بعض التطبيقات وجود المورد عمداً؛ وثّق السياسة لا خريطة عامة. قدم فئات آمنة ثابتة وتصحيحاً لا تفاصيل PDO والملفات. ميّز النجاح والفشل رغم JSON، ولا تعدل القراءة أو تترك الكتابة الفاشلة أثراً جزئياً لصحة الجسم الظاهر.
اختبار قرارات الاستجابة دون إرسال HTTP
يربط النموذج القراءة بالنجاح والغياب ويكشف العام فقط ورمزاً ثابتاً. لا يستدعي مساراً أو جلسة أو مستودعاً مضبوطاً. يسهل ذلك الفحص وتبقى الترويسات والتوجيه والوسيط بحاجة لتكامل HTTP. تنسق الخصوصية الإذن والغياب، ولا تكشف حقلاً لمجرد وجوده بالتخزين.
<?php
declare(strict_types=1);
function readResponse(array $courses, int $id): array {
if (!array_key_exists($id, $courses)) {
return ["status" => 404, "body" => ["error" => "course_missing"]];
}
return ["status" => 200, "body" => ["id" => $id, "title" => $courses[$id]["title"]]];
}
$courses = [1 => ["title" => "PHP", "internalNote" => "synthetic private field"]];
echo json_encode(readResponse($courses, 1), JSON_THROW_ON_ERROR), PHP_EOL;
echo json_encode(readResponse($courses, 2), JSON_THROW_ON_ERROR), PHP_EOL;
{"status":200,"body":{"id":1,"title":"PHP"}}
{"status":404,"body":{"error":"course_missing"}}
لا تكشف الملاحظة الداخلية؛ والأعداد نموذج قرار لا إرسال HTTP.
صيانة التوافق والأدلة عند التغيير
أصدر العقد عند تغير المعنى والإلزام والخطأ. عرّف هوية العملية ومنع تكرار أثر الكتابة عند الحاجة؛ فلا يثبت فقد الرد عدم الاعتماد. وضح ملكية المعاملة والخارج. اختبر الفك والمجال وفشل المحول ومساراً مركباً بمصطنع. يفيد البديل ولا يثبت المشغل والخادم. وثّق البيئة والفجوات لتكون الصيانة قابلة للفحص لا اسم إطار.
الأخطاء الشائعة وإصلاحها
قبول JSON المفكوك كسجل مجال صالح
- لماذا يحدث؟
- الخلط بين الصياغة والبنية والمعنى.
- كيف تصلحه؟
- فحص الحقول والأنواع وnull والحدود.
- كيف تتجنب تكراره؟
- اختبار null والقوائم والأنواع والمجهول.
تسرب حقول التخزين الخاصة إلى API
- لماذا يحدث؟
- تسلسل السجل كله دون مخطط عام.
- كيف تصلحه؟
- اختيار تمثيل استجابة مسموح.
- كيف تتجنب تكراره؟
- التحقق من غياب المحظور في العقود.
إعادة كتابة عمياء لفقد الرد
- لماذا يحدث؟
- الخلط بين غموض النقل وعدم الأثر.
- كيف تصلحه؟
- مطابقة الهوية وسياسة منع الأثر المكرر.
- كيف تتجنب تكراره؟
- اختبار الاكتمال الغامض والتكرار بأمان.
اختبر فهمك
1. لماذا لا يقرأ حاسب المجال $_POST مباشرة؟
اعرض الحل المشروح
يخلط النقل بالحساب ويربط الاختبار بالويب. فك وتحقق في المحول ومرر القيم صراحة فتستخدم القاعدة في CLI وHTTP بملكية خطأ وإذن واضحة.
2. للسجل ملاحظة خاصة. كيف تعالجها قراءة JSON؟
اعرض الحل المشروح
ابنِ المخرج من قائمة عامة وافحص غياب الخاص، ولا تسلسل السجل كله. صرّح قبل الكشف ووثّق الغائب وغير المأذون.
أهم ما تعلمته
- افصل فك النقل والمجال والحفظ والإرسال.
- يشمل العقد المصان الفشل والخصوصية والإعادة وحدود الدليل.