<?php
Route::get('mouse/redir', 'MouseController@redir');
Route::get('mouse/text', 'MouseController@text');
?>
И назначим этому контроллеру два действия. Одно будет что-нибудь выводить, а второе будет делать перенапрвление на первое:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class MouseController extends Controller {
public function redir(){
return redirect('mouse/text'); // перенаправляем на новый адрес
}
public function text(){
return 'Тише, мыши, кот на крыше';
}
}
?>
Это пример простейшего редиректа.
Данные формы
Во время выполнения перенаправления через redirect можно одновременно отправлять данные формы. Делается это с помощью метода withInput:<?php
return redirect('адрес')->withInput();
?>
Для получения отправленных данных можно использовать объект Request. Попробуем привести пример подобной передачи данных. Предположим, что есть небольшая форма:
<form action="mouse/result" method="get">
<input type="text" name="food">
<input type="submit">
</form>
Рассмотрим обработчик формы, который переадресует пользователя только в том случае, если в форму введено кодовое слово:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class MouseController extends Controller {
public function form(Request $request) {
if ($request->has('food')) {
$food = $request->input('food');
if ($food == 'cheese') { // проверка условия
// редирект, если верно
return redirect('mouse/result')->withInput();
} else { // условие не выполнено
return view('mouse.form'); // показать форму
}
} else { // форма ещё не отправлена
return view('mouse.form'); // показать форму
}
}
public function result(Request $request) {
return $request->input('food'); // показываем все принятые данные формы
}
}
?>
Если в форме использовался метод POST, то при редиректе с withInput пользователь попадёт на новый маршрут с методом POST. Это значит, что маршрут, на который будет переадресован пользователь должен разрешать метод POST (в Route::post). Иначе Laravel выдаст ошибку.
Иногда во время передачи данных появляется необходимость исключить какое-то поле из передаваемых данных. Это можно сделать в параметре метода withInput с помощью except:
<?php
return redirect('адрес')->withInput( $request->except('имя_поля') );
?>
Именованные маршруты
Маршрутам можно задавать имена, чтобы потом использовать эти имена в функции переадресации. Попробуем задать имя "food" для страницы со списком новостей о еде несколькими способами:<?php
Route::get('news/food', function () {
// задание имени с помощью метода "name"
})->name('food');
Route::get('news/food', ['as' => 'profile', function () {
// задание имени с помощью ключа массива "as"
}]);
// задание имени для действий контроллера
Route::get('news/food', 'MouseController@showProfile')->name('profile');
?>
Для получения имени текущего маршрута можно использовать метод currentRouteName:
<?php
$name = Route::currentRouteName();
?>
Чтобы использовать переадресацию по имени можно воспользоваться методом route, которые возвращает URL соответствующий названию маршрута:
<?php
$url = route('food'); // возвращает URL страницы
return redirect()->route('food'); // делает переадресацию
?>
При этом если у именованного маршрута есть параметры, то можно передать их вторым параметром в виде массива в метод route:
<?php
Route::get('news/{category}', function ($id) {
//
})->name('news');
$url = route('news', ['category' => 'food']);
?>