المتحكم الخاص بك يقوم بالمهمة الخاطئة
افتح المتحكم (Controller) الخاص بك. ابحث عن دالة store.
هل يحتوي على 40 سطرًا من الكود؟ هل ترى كتلة ضخمة من التحقق (validation)، وعدة جمل if، ومنطق عمل (business logic)، ثم جملة return؟
المتحكم الخاص بك يقوم بعمل لا ينبغي له القيام به.
للمتحكم وظيفة واحدة فقط. فهو يستقبل الطلب، ويستدعي خدمة (service) لحل المشكلة، ثم يعيد استجابة (response). إنه النادل، وليس الطاهي.
عندما تضع التحقق (validation) والتفويض (authorization) داخل المتحكم، فإنه يتحول إلى فوضى. ستنتهي بـ 80 سطرًا من الكود الذي لا يريد أحد لمسه.
يوفر Laravel حلاً مدمجًا: Form Requests.
النمط السيئ الشائع يبدو كالتالي:
- التحقق من صحة بيانات الإدخال
- التحقق من صلاحيات المستخدم
- تحويل البيانات
- تشغيل منطق العمل (business logic)
هذا يكسر مبدأ المسؤولية الواحدة (Single Responsibility Principle). يجب أن يكون للفئة (class) سبب واحد فقط للتغيير. يتغير المتحكم عندما يتغير تدفق الطلب، ولا ينبغي أن يتغير لمجرد تغير قاعدة تحقق.
استخدم هذا الأمر لإصلاح ذلك:
php artisan make:request StorePostRequest
سيؤدي هذا إلى إنشاء ملف مخصص لمنطق الطلب الخاص بك. انقل هذه الأشياء الثلاثة إلى الـ Form Request:
- التفويض (Authorization): استخدم دالة
authorize()للتحقق من الصلاحيات. - التحقق (Validation): استخدم دالة
rules()لتحديد متطلبات البيانات الخاصة بك. - تجهيز البيانات (Data Preparation): استخدم
prepareForValidation()لتنظيف أو تنسيق البيانات قبل عملية التحقق.
الآن انظر إلى المتحكم الخاص بك مرة أخرى:
public function store(StorePostRequest $request)
{
$post = Post::create($request->validated());
return redirect()->route('posts.show', $post);
}
أصبح طول المتحكم الآن سطرين فقط. لقد عاد ليعمل كنادل مرة أخرى.
يقوم Laravel بتشغيل التفويض والتحقق تلقائيًا قبل أن تبدأ دالة المتحكم حتى. إذا فشل التحقق، سيتلقى المستخدم خطأً على الفور.
اتبع هذه الإرشادات:
- اجعل التحقق ضمنياً (inline) إذا كان قصيرًا ويُستخدم في مكان واحد فقط.
- استخدم Form Request إذا زاد حجم التحقق، أو تكرر، أو تضمن عملية التفويض.
- لا تضع منطق العمل (business logic) في Form Request. استخدم طبقة الخدمة (Service layer) لذلك.
ابحث عن أكثر متحكم فوضوي لديك اليوم. استخرج عملية التحقق إلى Form Request، وراقب كيف يتقلص حجمه.
ما هي أكبر دالة store رأيتها على الإطلاق؟ أخبرني في التعليقات.
Source: https://dev.to/denisgusto1/seu-controller-ta-fazendo-o-trabalho-do-form-request-e-ele-nao-devia-512o
