درود دوستان. توی این پست فوت و فن های Redirect لاراول رو بررسی می‌کنیم. چند تا از مواردی رو که امروز با اونها آشنا می‌شیم، کمتر شناخته شده هستن و با بررسی اونها خواهیم دید که کاربرد زیادی دارن 😉

موارد زیر رو توی این پست یاد می‌گیریم:

هدایت (Redirect) چیه؟
هدایت ساده
هدایت به عقب
هدایت به همراه اطلاعات
هدایت به یک Route
هدایت به متد یک کنترلر
هدایت به خانه
هدایت امن
هدایت به مسیر فعلی
 هدایت به مسیر قبلاً تعیین شده
هدایت به یک آدرس خارجی
هدایت به همراه ذخیره آدرس فعلی 

     

 هدایت (Redirect) چی ه؟

وقتی قصد داریم یک کاربر رو از ی ک URL به یک URL دیگه منتقل کنیم از ری‌دایرکت استفاده میکنیم. ری‌دایرکت توی لاراول براحتی آب خوردن هست. برای اینکار از هلپر redirect() استفاده میکنیم.

 

هدایت ساده

برای اینکه کاربر رو به یک آدرس جدید منتقل کنیم از روش زیر استفاده می‌کنیم:

return redirect('/new/url');
return redirect('new/url');
return redirect('https://www.google.com');

دقت کنین مورد اول و دوم با هم برابر هستن. اسلش / اول آدرس به صورت خودکار توسط فریمورک حذف میشه.

این روش با روش زیر برابر هست و هیچ فرقی ندارن:

return redirect()->to('new/url');

 

هدایت به عقب

یه وقتایی که کاربر از یک آدرس به یک آدرس جدید منتقل میشه، لازم داریم که کاربر رو به آدرس قبلی برگردونیم. یعنی به جایی که از اون اومده:

return redirect()->back();

مثلاً وقتی که کاربر یک فرم رو ثبت می‌کنه، معمولاً به یک صفحه هدایت میشه تا اطلاعات فرم بررسی بشه. اگه قصد داریم بعد از پردازش فرم کاربر رو به صفحه قبل هدایت کنیم، از دستور بالا استفاده می‌کنیم.

 

هدایت به همراه اطلاعات

یه وقتایی لازمه کاربر رو به همراه یک سری اطلاعات به یک آدرس جدید منتقل کنیم. مثلاً با یک پیام موفقیت‌آمیز بودن عملیات. می‌تونیم برای هر آیتم از with() بصورت زنجیره‌ای و یا از with() بصورت آرایه‌ای استفاده کنیم:

return redirect('url')->with('success', true)->with('success', 'Thank You!');

// or

return redirect('/')->with([
    'success' => true,
    'message' => 'Thank You!',
]);

با اینکار، یک مقدار توی Session برنامه ذخیره میشه و می‌تونیم توی Blade بصورت زیر استفاده کنیم:

@if (session('success'))
    <div class="alert alert-success">
        {{ session('message') }}
    </div>
@endif

دقت کنین که این اطلاعات فقط یک بار قابل استفاده هستن و بعد از ری‌دایرکت به صفحه جدید از Session حذف میشن.

اگه می‌خوایم کاربر رو با اطلاعاتی که از یک فرم فرستاده، به صفحه قبل منتقل کنیم از withInput() استفاده میکنیم. این برای زمانی خوبه که کاربر یک سری ورودی رو پر کرده ولی اطلاعات ناقص هست، و می‌خوایم ورودی‌هایی که کاربر پر کرده رو براش نگه داریم تا مجبور نشه دوباره اونها رو پر کنه:

return back()->withInput();

و برای دسترسی به ورودی‌های قدیمی توی Blade از تابع old() استفاده می‌کنیم:

<input name="email" value="{{ old('email') }}">

 

هدایت به یک Route

اگه برای یک روت (Route) یک name اختصاص داده باشیم، یعنی:

Route::get('/posts', 'PostsController@index')->name('posts');

می‌تونیم به شکل زیر کاربر رو به این مسیر هدایت کنیم:

return redirect()->route('posts');

این برای زمانی خوبه که آدرس Route ما ممکنه بعداً تغییر کنه. مثلا بجای /posts بشه /all-posts

اگه این Route یک یا چند پارامتر لازم داره، اونها رو بصورت زیر مینویسیم:

// web.php:
Route::get('/posts/{id}/{slug}', 'PostsController@show')->name('posts.single');

// App:
return redirect()->route('posts.single', [489, 'hello']); // example.com/posts/489/hello

 

هدایت به متد یک کنترلر

یک روش وجود داره که می‌تونیم کاربر رو به متد یک کنترلر هدایت کنیم. برای این کار از  action() استفاده میکنیم:

return redirect()->action('HomeController@submit');

دقت کنین که چنین کنترلری با این متد باید وجود داشته باشه.

نکته‌ای که حتی توی مستندات لاراول بهش اشاره نشد، اینه که باید برای این Action، توی فایل web.php یک روت تعریف شده باشه. یعنی:

Route::get('/home', 'HomeController@submit');

در واقع کاربر به مسیری که توی Route (توی فایل web.php) تعریف کردیم، یعنی /home هدایت میشه.

 

هدایت به خانه 🏠

با استفاده از home() میتونیم کاربر رو به مسیر روت وبسایت یا خانه هدایت کنیم:

return redirect()->home();

در واقع این نسخه کوتاه شده زیر هست:

return redirect()->route('home');

پس باید توی فایل web.php یک روت با نام home داشته باشیم.

 

هدایت امن

با استفاده از secure()، هدایت‌ها به همراه https خواهد بود:

return redirect()->secure('/checkout'); // https://www.example.com/checkout

 

هدایت به مسیر فعلی

یه وقتایی وجود داره که می‌خوایم کاربر رو به همین مسیری که الان توی اون هست هدایت کنیم. در واقع همین مسیر رو Refresh کنیم. این کار با متد refresh() انجام میگیره:

return redirect()->refresh();

این برای زمانی خوبه که کاربر با متد POST اومده. با این روش کاربر به همین مسیر ولی با متد GET هدایت میشه. دقت کنین که اگه کاربر با متد GET اومده باشه، ریدایرکت بی‌نهایت میشه.

 

هدایت به مسیر قبلاً تعیین شده

برای مثال کاربر آدرس /dashboard رو باز می‌کنه ولی لازمه قبلش لاگین کرده باشه. پس ابتدا کاربر رو به مسیر /login هدایت میکنیم. وقتی لاگین انجام شد، بهتره که کاربر رو دوباره به همون مسیر قبلا مورد نظرش بوده هدایت کنیم. یعنی /dashbaord. برای این کار از متد intended() استفاده میکنیم:

return redirect()->intended();

 

هدایت به یک آدرس خارجی

وقتی میخوایم کاربر رو به یک آدرس خارجی منتقل کنیم، بهتره که از متد away() استفاده کنیم. چون با این روش هیچ اعتبارسنجی روی مسیر وارد شده انجام نمیشه:

return redirect()->away('http://www.ditty.ir');

 

هدایت به همراه ذخیره آدرس فعلی

اگه می‌خوایم کاربر رو به یک مسیر هدایت کنیم و لازم داریم مسیر فعلی رو داشته باشیم، از guest() استفاده میکنیم. با این روش مسیر فعلی توی سشن ذخیره میشه:

return redirect()->guest('/login');

 

خب دوستان امیدوارم از این مقاله استفاده کرده باشین. قسمتی از مطالبی که گفتم توی سطح اینترنت وجود نداشت و مستندات لاراول هم به اونها اشاره نکرده بود. روزتون خوش 😉 🌹

من برای این مقاله از یک سری اطلاعات شخصی و منابع زیر استفاده کردم: