تابع redirect یکی از توابع کمکی و بسیار مفید در فریمورک لاراول است. از این تابع میتوان برای تغییر جهت کاربر به URLهای متفاوت استفاده کرد. فریمورک لاراول توابع کمکی مفید و زیادی دارد، بدون شک یکی از این توابع، تابع redirect است. در این مقاله به بررسی دقیق این تابع و همچنین راههای استفاده از آن خواهیم پرداخت. ما چگونگی تغییر جهت کاربر به یک صفحه و یا یک اکشن مشخص همراه با داده و یا بدونه دادههای مورد نظر را بررسی خواهیم کرد.
همه پاسخها(response) در فریمورک لاراول جزئی از کلاس Illuminate\Http\RedirectResponse هستند که میتوانند هدرهای مناسبی را برای هرگونه تغییر مسیر اضافه کنند.
در این مقاله من فرض میکنم که شما در حال استفاده از کنترلر خود هستید، در جایی که تمام اقدامات و عملیاتهای مورد نظر خود را در اکشن کنترلر انجام دادید و حالا میخواهید که کاربر را به نقطه مورد نظر در اپلیکیشن خود ریدایرکت کنید.
ریدایرکت کردن به یک URL مشخص
ما آموزش خود را با یک مثال ساده از متد ریدایرکت آغاز میکنیم. برای ریدایرکت کردن کاربر به صفحه home از وبسایت خود میتوانیم از متد زیر استفاده کنیم:
return redirect('');
در ادامه اگر شما هر چیزی در داخل متد redirect() قرار دهید به عنوان یک پارامتر در نظر گرفته میشود، این پارامتر به URL پایهی اپلیکیشن شما اضافه میشود:
return redirect('welcome');
در مثال بالا از متد ریدایرکت برای تغییر جهت کاربر به صفحه Base URL/welcome استفاده شد. به طور مشابه شما میتوانید پارامترهای دیگری که مد نظر دارید را در این متد قرار دهید.
return redirect('admin/dashboard');
ریدایرکت کردن به عقب - redirect back
جدای از استفاده از متد ریدایرکت به صورت تکی، چندین متد دیگر نیز وجود دارند که میتوانند به همراه متد ریدایرکت مورد استفاده قرار بگیرند.
تصور کنید، شما میخواهید کاربر را پس از انجام عملیات اعتبارسنجی بعضی از دادهها به موقعیت قبلی خود بازگردانید، در این صورت شما میتوانید از متد back() پس از redirect() استفاده کنید:
return redirect()->back();
نکته: شما میتوانید از متد return back() نیز در صورتی که تمایلی به استفاده از متد redirect() ندارید استفاده کنید.
ریدایرکت کردن با استفاده از نام روت
برخی از برنامهنویسها استفاده از نام روتها در اپلیکیشن خود را بیشتر ترجیح میدهند و تلاش میکند که این شیوه کدنویسی را در همه جای اپلیکیشن خود رعایت کنند. علاوه بر استفاده از URLها در متد ریدایرکت، شما میتوانید از نام روتها برای فراخوانی روت مورد نظر استفاده کنید. برای این کار دقیقا مشابه با متد back()، متد route را پس از ریدایرکت قرار میدهیم.
تصور کنید، ما میخواهیم کاربر را پس از ذخیره پست جدیدش به صفحهی که لیستی از پستها در آن قرار دارد برگردانیم. در این حالت ما از نام روت به صورت زیر استفاده میکنیم:
return redirect()->route('posts.index');
متد route() یک پارامتر دیگر نیز میگیرد. این پارامتر در واقع آرایهای است که ما با استفاده از آن میتوانیم برای روت مورد نظر خود پارامتر تعریف کنیم، در واقع با استفاده از آن داده انتقال دهیم.
به عنوان مثال، تصور کنید که ما یک روت داریم که کاربر را به صفحه ویرایش پست هدایت میکند:
Route::get('post/{id}', 'PostController@edit')-name('post.edit');
ما میتوانیم این روت را با استفاده از قطعه کد زیر برگردانیم:
return redirect()->route('post.edit', ['id' => $post->id]);
اگر شما فقط یک پارامتر واحد دارید میتوانید مانند زیر آن را بنویسید:
return redirect()->route('post.edit', $post->id);
اگر شما قصد دارید که در آیند تغییری در ساختار URL خود دهید، استفاده از ریدایرکت به همراه نام روتها میتواند برای شما بسیار مفید و سودمند باشد. شما نیاز ندارید که برای ریدایرکت کردن هر دفعه URL خود را آپدیت کنید تنها کافی است از نام آن برای اشاره کردن به روت مورد نظر خود استفاده کنید.
پیشنهاد میکنم تا جایی که میتوانید از نام روتها برای ریدایرکت کردن در همه ابلیکیشن های لاراولی خود استفاده کنید.
ریدایرکت کردن به همراه داده
در قسمت قبل ما با چگونگی ریدایرکت کردن کاربر به یک URL ، روت مشخص یا به صفحهی قبلی آشنا شدیم. شما ممکن است در یک موقعیت نیاز پیدا کنید که همراه ریدایرکت کردن کاربر مقداری داده اضافه نیز ارسال کنید، برای حل این مشکل متد ریدایرکت در لاراول دو متد زیرمجموعهی with() و withInput() را ارائه داده است. شما با استفاده از این متدها میتوانید به همراه ریدایرکت به ارسال داده بپردازید.
در ادامه به توضیح چگونگی استفاده از متد with() میپردازیم، به مثال زیر توجه کنید:
return redirect()->back()->with('success', 'Post saved successfully.');
در مثال بالا ما کاربر را به صفحه قبلی خود باز گرداندیم و کلید success را همراه با داده های آن به session خود اضافه کردیم. پس از آن شما میتوانید مقدار success را در کنترلر و یا در view خود بازیابی کنید.
شما همچنین میتوانید از چندین متد with() استفاده کنید، اگر شما میخواهید که پیامها و یا دادههایی مانند مثال زیر را ارسال کنید:
return redirect()->back()
->with('success', 'Post saved successfully.')
->with('post_id', $post->id);
راه حل مرتبتر دیگر، استفاده از آرایه و قرار دادن همه اطلاعات مورد نیاز برای ارسال در آرایه است. پس از آن ما میتوانیم این آرایه را در متد with() خود قرار دهیم:
$response = [
'success' => 'Post saved successfully.',
'post_id' => $post->id,
];
return redirect()->back()->with($response);
همانطور که در مثال بالا دیدید کد بالا نسبت به حالت قبل خوانایی بیشتری پیدا کرده است.
در ادامه اگر شما بخواهید که پس از ارسال داده های فرم خود به عقب ریدایرکت کنید، شما باید از متد withInput() استفاده کنید. این متد هیچ پارامتری را نمیگیرد و همچنین هیچ داده ای را در session ذخیره نمیکند. پس از آن در view خود شما میتوانید با استفاده از متد old($key) دادههای ارسال شده با یک کلید مشخص را دریافت کنید.
ریدایرکت کردن به یک اکشن
در لاراول علاوه بر موارد بالا شما میتوانید به یک اکشن خاص در کنترلر خود ریدایرکت کنید. این ویژگی مشابه ویژگی موجود در فریمورک سیمفونی است. برای این کار کافی است از متد action() در ریدایرکت خود استفاده کنید:
return redirect()->action('PostController@edit);
در صورتی که شما میخواهید دادهای را به اکشن مورد نظر خود ارسال کنید میتوانید آن را به عنوان پارامتر دوم در متد اکشن خود قرار دهید مانند زیر:
return response()->action('PostController@edit', ['id' => $post->id]);
در پروژههای واقعی، شما ممکن است بخواهید که کاربر خود را به یک اکشن از کنترلر بفرستید در این صورت پیشنهاد میشود که از ریدایرکت همراه با نام روت(redirect route) استفاده کنید.
نتیجهگیری
درست مانند سایر ویژگی های فوق العاده لاراول، تغییر مسیر دادن با استفاده از متد redirect به صورت خیلی ساده در آمده است. شما باید همیشه تلاش کنید از شیوههای استاندارد کدنویسی مانند شیوههایی که برنامه نویسهای حرفه ای اتخاذ میکنند استفاده کنید.
درصورتی که سوال یا ابهام در مورد این مقاله دارید، میتوانید آن را در بخش نظرات با ما به اشتراک بگذارید.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید