آپ کا کنٹرولر غلط کام کر رہا ہے
اپنا کنٹرولر کھولیں۔ store میتھڈ تلاش کریں۔
کیا اس میں کوڈ کی 40 لائنیں ہیں؟ کیا آپ کو ایک بڑا ویلیڈیشن بلاک، کئی if سٹیٹمنٹس، بزنس لاجک، اور پھر ایک return سٹیٹمنٹ نظر آتی ہے؟
آپ کا کنٹرولر وہ کام کر رہا ہے جو اسے نہیں کرنا چاہیے۔
ایک کنٹرولر کا صرف ایک کام ہوتا ہے۔ یہ ایک ریکویسٹ وصول کرتا ہے، مسئلے کو حل کرنے کے لیے ایک سروس کو کال کرتا ہے، اور ایک رسپانس واپس کرتا ہے۔ یہ ویٹر ہے، شیف نہیں۔
جب آپ کنٹرولر کے اندر ویلیڈیشن اور اتھارزیشن (authorization) ڈالتے ہیں، تو یہ ایک الجھن بن جاتا ہے۔ آپ کے پاس کوڈ کی 80 لائنیں جمع ہو جاتی ہیں جنہیں چھونے کا کوئی دل نہیں کرتا۔
Laravel کے پاس ایک بلٹ ان (built-in) حل ہے: Form Requests۔
ایک عام غلط پیٹرن کچھ اس طرح کا ہوتا ہے:
- ان پٹ ڈیٹا کی ویلیڈیشن کرنا
- صارف کی اجازت (permissions) چیک کرنا
- ڈیٹا کو تبدیل کرنا (transforming)
- بزنس لاجک چلانا
یہ Single Responsibility Principle کی خلاف ورزی کرتا ہے۔ ایک کلاس کے پاس تبدیل ہونے کی صرف ایک ہی وجہ ہونی چاہیے۔ کنٹرولر تب بدلتا ہے جب ریکویسٹ کا بہاؤ (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 استعمال کریں۔
- 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
