Laravel / حدود التطبيق وسير العمل الموثوق / الدرس 8
Form Requests وحدود المدخل الموثوق
استخدم Form Request للتفويض والتحقق الخاصين بالطلب ثم مرر شكلا صريحا للعمل.
في هذه الصفحة
أهداف الدرس
- التحقق يجيب عن سؤال محدد
- إعلان الحقول القابلة للكتابة فقط
- المدخل المتداخل والقيود المتزامنة
التحقق يجيب عن سؤال محدد
يثبت التحقق مطابقة القواعد لا إذن الفعل أو بقاء الصف أو نجاح المعاملة. حدد المعنى والحجم والاختيار والعلاقات قبل القواعد. يختلف الإنشاء والتعديل الجزئي، وتختلف nullable وsometimes فلا تضفهما لإسكات الخطأ. أبعد معرف المؤلف وحالة الإشراف عن كتابة العميل وإن كانا سمتي نموذج.
دورة حياة صريحة للطلب
تجمع Form Request التفويض والقواعد وينفذ الإطار دورة التحقق عند حلها قبل المتحكم. تفوض authorize إلى سياسة وتصف rules المقبول. يختلف المنع عن خطأ التحقق؛ فالأول ممنوع عادة والثاني إعادة بمتغيرات خطأ أو JSON المناسب. يظل middleware مالك فحص الدخول ولا يصلح أول المتحكم طلبا لم يصله.
إعلان الحقول القابلة للكتابة فقط
يقع الصنف في Requests ويفترض مسارا مصادقا وسياسة create مسجلة. يقبل عنوانا وجسما محدودين ويسأل السياسة. يجب تعريف قرارها كما في درسها. لا توجد user_id أو published لأنها ليست قرار العميل. لا ترفض القواعد كل حقل أعلى زائد تلقائيا، لذلك استهلك المسموح لا all().
<?php
namespace App\Http\Requests;
use App\Models\Post;
use Illuminate\Foundation\Http\FormRequest;
class StorePostRequest extends FormRequest
{
public function authorize(): bool
{
return $this->user()?->can("create", Post::class) ?? false;
}
public function rules(): array
{
return [
"title" => ["required", "string", "max:120"],
"body" => ["required", "string", "max:5000"],
];
}
}
Authorized JSON request with missing title: validation response 422 with a title error.
يجب أن تسمح السياسة المسجلة بالإنشاء ويتكون عقد الكتابة من العنوان والجسم المحدودين.
استهلاك المتحقق دون الثقة بحقوق الملكية
يستخدم المتحكم العنوان والجسم وينشئ عبر علاقة المستخدم ويجعل published=false خادميا، ويفترض العلاقة وfillable والعمود والمسار المسمي بعينة معزولة. لا يختار user_id المرسل المؤلف. يكمل التحقق ضبط الإسناد ولا يعوض الشكل الصريح. تصف الإعادة نتيجة نجاح الإدراج ولا تدعي قراءة المقطع تنفيذ قاعدة.
<?php
namespace App\Http\Controllers;
use App\Http\Requests\StorePostRequest;
use Illuminate\Http\RedirectResponse;
class PostController extends Controller
{
public function store(StorePostRequest $request): RedirectResponse
{
$data = $request->validated();
$post = $request->user()->posts()->create([
"title" => $data["title"],
"body" => $data["body"],
"published" => false,
]);
return redirect()->route("posts.show", $post);
}
}
On a successful isolated insert: author is the authenticated user, published is false, then redirect to posts.show.
تحدد العلاقة المؤلف ويثبت الخادم النشر ويتطلب المسار، وهو مقطع لا كتابة منفذة.
المدخل المتداخل والقيود المتزامنة
حدد مفاتيح المصفوفة وقيمها؛ فقد يحتفظ الأب المتحقق بمفاتيح زائدة. لا يحول التحقق كل مقبول لنوع المجال؛ قد يحتاج النص الصحيح تحويل أمر مكتوب. تفيد unique التغذية الراجعة ولا تمنع إدراجا متزامنا دون قيد قاعدة ومعالجة. اختبر الويب وJSON ورسائل التصحيح دون أسرار.
الأخطاء الشائعة وإصلاحها
يتوقف الطلب المصادق قبل المتحكم
- لماذا يحدث؟
- رفض تفويض Form Request.
- كيف تصلحه؟
- افحص السياسة والدورة.
- كيف تتجنب تكراره؟
- اختبر التفويض والقيم منفصلين.
يغير العميل سمة خادم
- لماذا يحدث؟
- مررت كل المدخل للحفظ.
- كيف تصلحه؟
- ابن الشكل من المتحقق المسموح.
- كيف تتجنب تكراره؟
- اختبر الحقول الزائدة.
تبقى مفاتيح داخلية زائدة
- لماذا يحدث؟
- قُيد الأب أو بعض الأبناء فقط.
- كيف تصلحه؟
- حدد المفاتيح واستهلك شكلا ضيقا.
- كيف تتجنب تكراره؟
- اختبر الزائد المتداخل.
اختبر فهمك
1. لماذا يبقى قيد unique مع قاعدته بالطلب؟
اعرض الحل المشروح
قد ينجح تحقق متزامنين قبل الإدراج. يحسم القيد الكتابة ويفيد التحقق مبكرا، فعالج رفض القيد ولا تعد التحقق حجزا.
2. صمم تحقق preferences التي تسمح locale وtimezone فقط.
اعرض الحل المشروح
حدد array بالمفتاحين وقواعدهما ثم ارفض الزائد وابن القيمة من المعتمد؛ فلا تثبت array وحدها العقد الضيق.
أهم ما تعلمته
- يختلف التحقق والتفويض.
- يحتاج المتحقق شكل كتابة مقصودا.
- تغلق قيود القاعدة فجوات التزامن.