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