کنترلر شما دارد کار اشتباهی انجام میدهد
کنترلر خود را باز کنید. به دنبال یک متد store بگردید.
آیا ۴۰ خط کد دارد؟ آیا یک بلوک اعتبارسنجی (validation) غولآسا، چندین دستور if ،منطق تجاری (business logic) و سپس یک دستور return میبینید؟
کنترلر شما در حال انجام کاری است که نباید انجام دهد.
یک کنترلر فقط یک وظیفه دارد. درخواست را دریافت میکند، یک سرویس (service) را برای حل مشکل فراخوانی میکند و یک پاسخ (response) برمیگرداند. کنترلر مانند یک پیشخدمت است، نه یک آشپز.
وقتی اعتبارسنجی (validation) و احراز هویت (authorization) را داخل یک کنترلر قرار میدهید، همه چیز به هم ریخته میشود. در نهایت با ۸۰ خط کد مواجه میشوید که هیچکس نمیخواهد به آنها دست بزند.
Laravel یک راهکار داخلی دارد: Form Requests.
یک الگوی اشتباه رایج به این شکل است:
- اعتبارسنجی دادههای ورودی
- بررسی مجوزهای کاربر
- تغییر شکل دادهها (Transforming data)
- اجرای منطق تجاری (business logic)
این کار اصل تکمسئولیتی (Single Responsibility Principle) را نقض میکند. یک کلاس باید فقط یک دلیل برای تغییر داشته باشد. یک کنترلر زمانی تغییر میکند که جریان درخواست (request flow) تغییر کند. نباید صرفاً به دلیل تغییر یک قانون اعتبارسنجی، تغییر کند.
برای اصلاح آن از این دستور استفاده کنید:
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
