Form Request Validation في Laravel: أفضل طريقة للتحقق من البيانات

بعد التعامل مع البيانات عبر Eloquent وبناء العلاقات بين الجداول، تظهر مرحلة لا تقل أهمية، وهي التحقق من البيانات القادمة من المستخدم.
فهنا تحديدًا، يقع كثير من المطورين في مشكلة متكررة:
قبول بيانات غير صحيحة، أو كتابة منطق التحقق داخل Controllers بشكل فوضوي.

في المقابل، يحتاج المطور إلى أسلوب منظّم، قابل لإعادة الاستخدام، وسهل الصيانة.
نتيجةً لذلك، قدّم Laravel مفهوم Form Request Validation كحل احترافي لهذه الإشكالية.


المشكلة: التحقق من البيانات داخل Controller

كثيرًا ما نرى كودًا بهذا الشكل داخل Controller:

$request->validate([
    'title' => 'required',
    'content' => 'required|min:10',
]);

في البداية، قد يبدو هذا الأسلوب مقبولًا، ولكن مع توسّع المشروع تظهر عدة مشاكل، من بينها:

  • تضخّم Controllers بسرعة
  • تكرار نفس قواعد التحقق في أكثر من مكان
  • صعوبة اختبار الكود
  • ضعف تنظيم منطق التحقق

وبالتالي، يصبح المشروع أقل وضوحًا وأكثر عرضة للأخطاء.


الحل: استخدام Form Request Validation

Laravel يوفّر Form Request Validation كحل مباشر لتنظيم عملية التحقق من البيانات.
فبدل وضع قواعد التحقق داخل Controller، يتم فصلها في كلاس مخصّص.

وبذلك:

  • يصبح Controller أنظف
  • يُعاد استخدام قواعد التحقق بسهولة
  • يتحسّن تنظيم المشروع بشكل عام

ما هو Form Request في Laravel؟

Form Request هو كلاس مخصّص يحتوي على:

  • قواعد التحقق من البيانات
  • رسائل الخطأ
  • منطق السماح أو الرفض للطلب

وبالتالي، يتم التعامل مع التحقق من البيانات كجزء مستقل من التطبيق.


إنشاء Form Request في Laravel

لإنشاء Form Request، نستخدم Artisan:

php artisan make:request StorePostRequest

سيتم إنشاء الملف داخل:

app/Http/Requests

تعريف قواعد التحقق داخل Form Request

داخل الملف المنشأ:

public function rules()
{
    return [
        'title' => 'required|string|max:255',
        'content' => 'required|min:10',
    ];
}

بهذا الشكل، تصبح جميع قواعد التحقق واضحة ومجمّعة في مكان واحد.


ربط Form Request بالـ Controller

بدل استخدام Request العادي، نقوم بحقن Form Request مباشرة:

public function store(StorePostRequest $request)
{
    Post::create($request->validated());
}

نتيجةً لذلك:

  • Laravel يتحقق من البيانات تلقائيًا
  • في حال وجود خطأ، يتم إرجاع المستخدم مع رسائل الخطأ
  • لا حاجة لكتابة أي كود إضافي داخل Controller

تخصيص رسائل الخطأ

يمكنك تخصيص رسائل الخطأ داخل Form Request:

public function messages()
{
    return [
        'title.required' => 'عنوان المقال مطلوب',
        'content.min' => 'المحتوى يجب أن يحتوي على 10 أحرف على الأقل',
    ];
}

وبذلك، تتحكم في تجربة المستخدم بشكل أفضل.


التحكم في الصلاحيات داخل Form Request

Form Request يحتوي على دالة authorize:

public function authorize()
{
    return true;
}

يمكنك استخدامها للتحقق مما إذا كان المستخدم مخوّلًا لتنفيذ الطلب.
وبالتالي، يمكنك منع تنفيذ الطلب قبل الوصول إلى Controller.


لماذا Form Request أفضل من validate داخل Controller؟

لأن Form Request:

  • يفصل منطق التحقق عن منطق التطبيق
  • يقلّل التكرار
  • يسهل اختباره
  • يجعل المشروع أكثر تنظيمًا

وبالإضافة إلى ذلك، يصبح تعديل قواعد التحقق لاحقًا أسهل وأوضح.


أخطاء شائعة عند استخدام Form Request

نسيان استخدام validated()

المشكلة: تمرير بيانات غير محقّقة
الحل: استخدام $request->validated() دائمًا


وضع منطق غير متعلق بالتحقق داخل Form Request

المشكلة: خلط المسؤوليات
الحل: حصر Form Request في التحقق فقط


إنشاء Form Request لكل طلب بدون حاجة

المشكلة: تعقيد غير ضروري
الحل: استخدام Form Request فقط في الطلبات المهمة أو المتكررة


متى يصبح Form Request ضروريًا؟

Form Request يصبح ضروريًا عندما:

  • يحتوي المشروع على نماذج متعددة
  • تتكرر قواعد التحقق
  • يعمل أكثر من مطور على نفس المشروع
  • تسعى لتنظيم الكود بشكل احترافي

وبالتالي، إهماله يؤدي إلى Controllers متضخّمة وصعبة الصيانة.


مقالات ذات صلة

اترك رد