کنترلر شما بیش از حد مشغول است
کنترلر خود را باز کنید. به متد store نگاه کنید.
آیا ۴۰ خط کد دارد؟ آیا با یک بلوک اعتبارسنجی (validation) عظیم شروع میشود، سپس چندین دستور if میآید، بعد منطق تجاری (business logic) و در نهایت یک return؟
کنترلر شما در حال انجام کاری است که وظیفهاش نیست.
یک کنترلر تنها یک نقش ساده دارد. درخواست را دریافت میکند، یک سرویس را برای حل مشکل فراخوانی میکند و یک پاسخ را برمیگرداند. آن را مانند یک پیشخدمت تصور کنید. پیشخدمت غذا را برای شما میآورد، اما آن را نمیپزد.
وقتی اعتبارسنجی (validation)، تعیین سطح دسترسی (authorization) و پردازش دادهها را داخل یک کنترلر قرار میدهید، همه چیز به هم ریخته میشود. در نهایت با یک هیولای ۸۰ خطی روبرو میشوید که هیچکس نمیخواهد به آن دست بزند.
لاراول یک راهکار داخلی دارد: Form Requests.
از تکرار منطق اعتبارسنجی و تعیین سطح دسترسی در هر متد دست بردارید. از اصل تکمسئولیتی (Single Responsibility Principle) استفاده کنید. یک کلاس باید فقط یک دلیل برای تغییر داشته باشد. یک کنترلر زمانی تغییر میکند که جریان درخواست (request flow) تغییر کند. نباید صرفاً به دلیل تغییر یک قانون اعتبارسنجی، تغییر کند.
این دستور را برای ایجاد یک کلاس درخواست اختصاصی اجرا کنید:
php artisan make:request StorePostRequest
منطق خود را به این کلاس جدید منتقل کنید. یک Form Request سه مورد اصلی را مدیریت میکند:
• Authorization: از متد authorize استفاده کنید تا تصمیم بگیرید آیا کاربر اجازه انجام یک عملیات را دارد یا خیر. اگر این متد false برگرداند، لاراول بهطور خودکار خطای ۴۰۳ ارسال میکند.
• Validation: از متد rules برای تعریف الزامات دادههای خود استفاده کنید.
• Data Preparation: از prepareForValidation برای پاکسازی یا تغییر شکل دادهها قبل از اجرای اعتبارسنجی استفاده کنید. این کار برای تولید slug یا نرمالسازی شماره تلفنها عالی است.
وقتی این منطق را منتقل کنید، کنترلر شما کوچک میشود. ممکن است به این شکل باشد:
public function store(StorePostRequest $request)
{
$post = Post::create($request->validated());
return redirect()->route('posts.show', $post);
}
همین است. دو خط.
کنترلر سبک باقی میماند زیرا لاراول قبل از اینکه متد حتی شروع شود، اعتبارسنجی و تعیین سطح دسترسی را اجرا میکند. اگر دادهها اشتباه باشند، کاربر بلافاصله با خطا مواجه میشود.
یک نکته احتیاطی: از Form Requests برای همه چیز استفاده نکنید. اگر یک مسیر (route) بسیار کوچک با یک فیلد ساده دارید، اعتبارسنجی را همانجا (inline) نگه دارید. زمانی از Form Requests استفاده کنید که منطق پیچیده میشود، تکرار میشود یا با مجوزها (permissions) درگیر است.
همچنین، منطق تجاری (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
