بعد التعامل مع البيانات عبر 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 متضخّمة وصعبة الصيانة.
