[ Laravel ] فن كتابة الـ Middleware والـ Service Layer في Laravel: إزاي تنقذ الـ Controllers من الفوضى؟

مصطفى قبيصي

عضو جديد
9 فبراير 2023
6
2
49
مصر
سلام الله عليكم ورحمته وبركاته إخواني وأحبابي في منتدى نقطة التطوير

واحدة من أكبر المشاكل اللي بنشوفها في مشاريع لارفيل لما بتكبر، هي ظاهرة Fat Controllers؛ تفتح الـ Controller تلاقي الدالة الواحدة فيها 150 سطر: بتفحص الصلاحيات، بتعمل Validation، بتعالج الصور، بتكلم 3 APIs خارجية، وبتعمل إدخال في 4 جداول!

النتيجة كود معقد جداً، مستحيل يتعمل عليه Unit Testing، وأي تعديل فيه كابوس.
في المقال ده، هنتعلم إزاي نخلي الـ Controller رفيع وأنيق (Skinny Controller) بـ 5 سطور بس، ونوزع الشغل باحترافية بين الـ Middleware والـ Form Requests والـ Service Layer.

1. الـ Middleware: حارس البوابة الذكي
أي فحص أمني أو تحقق من حالة المستخدم والطلب لازم يتعمل قبل ما يوصل للكونترولر أصلاً:
  • التحقق من الرتب والصلاحيات: فحص هل الحساب مفعل، محظور، أو VIP.
  • الـ Rate Limiting: منع السبام والطلبات المتكررة من نفس الـ IP.
  • تسجيل الطلبات والتتبع (Logging & Metrics).

2. الـ Form Request: عزل عمليات التحقق من البيانات (Validation)
بدل ما تحط قواعد الـ Validate جوه الدالة:
Bash:
من فضلك قم , تسجيل الدخول أو تسجيل لعرض المحتوى
وفي داخل الكلاس تحدد القواعد ورسائل الخطأ بالعربي، والـ Controller يستقبل الـ Request بعد التأكد من صحته بنسبة 100%.

3. الـ Service Layer: مستودع منطق العمل الحقيقي (Business Logic)
بنعمل كلاس مستقل اسمه UserService في مجلد app/Services:
PHP:
من فضلك قم , تسجيل الدخول أو تسجيل لعرض المحتوى

4. النتيجة في الـ Controller: 5 سطور فقط من النظافة والجمال!
PHP:
من فضلك قم , تسجيل الدخول أو تسجيل لعرض المحتوى

المكاسب اللي حققناها:
  • إعادة الاستخدام: تقدر تستخدم نفس الـ UserService في الـ Web، وفي الـ API، وفي أوامر الـ Console Commands بدون تكرار الكود.
  • سهولة الفحص (Testing): تقدر تعمل Mock للخدمة وتعمل Unit Test للكونترولر في ثواني.
  • وضوح وسهولة صيانة لا تقارن.

جربوا تطبيق المنهجية دي في مشاريعكم وشاركوني تجاربكم وأسئلتكم في التعليقات!
 

AdBlock Detected

We apologize, but you must disable AdBlock to view this site.

We rely on advertisements to support the continuity of the site and provide the best content.