Пусть у нас есть вот такие маршруты:
<?php
Route::get('test/show1', 'TestController@show1');
Route::get('test/show2', 'TestController@show2');
?>
Давайте по обращению к действиям контроллера будем выводить какие-нибудь строки:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class TestController extends Controller
{
public function show1()
{
return 'show1';
}
public function show2()
{
return 'show2';
}
}
?>
Давайте теперь сделаем так, чтобы при обращению к первому действию выполнялась переадресация на второе действие:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class TestController extends Controller
{
public function show1()
{
return redirect('test/show2'); // перенаправляем на адрес
}
public function show2()
{
return 'show2';
}
}
?>
Сделайте действие с формой, в которой будет один инпут для ввода числа. Пусть форма отправляется на это же действие. Сделайте так, что если введено число от 1 до 10, то выполнится редирект на другое действие, представление которого выведет сообщение 'форма успешна отправлена'.
Если же введено число не из разрешенного диапазона, снова покажите пользователю форму, написав над ней сообщение о том, что введено некорректное число.
Редиректы с данными формы
При редиректе можно прикреплять данные формы с помощью метода withInput:
<?php
return redirect('адрес')->withInput();
?>
Отправленные таким образом данные можно будет получить на той странице, на которую выполнился редирект, с помощью объекта Request, подобно тому, как получаются данные обычной формы.
Посмотрим применение на практическом примере.
Пусть у нас в контроллере Test есть действие form со следующей формой, значением ожидающей какое-нибо число:
<form action="">
<input type="text" name="num">
<input type="submit">
</form>
Давайте после отправки формы проверим, попадает ли введенное число в промежуток от 0 до 10 и, если попадает, выполним редирект на другое действие, передав в него данные нашей формы:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class TestController extends Controller
{
public function form(Request $request)
{
// Если форма была отправлена...
if ($request->has('num')) {
// Получим отправленное число:
$num = $request->input('num');
// Если выполняется условие...
if ($num >= 0 and $num <= 10) {
// Выполним редирект с данными формы:
return redirect('test/result')->withInput();
} else {
// Условие не выполнено - опять покажем форму:
return view('test.form');
}
} else {
// Если форма не была отправлена...
return view('test.form'); // покажем представление с формой
}
}
public function result(Request $request)
{
// После редиректа выведем на экран данные формы:
return $request->input('num');
}
}
?>
Учтите, что если форма отправляется методом POST, то и при редиректе с withInput вы попадете в новый маршрут с методом POST.
На практике это значит, что маршрут, НА который мы редиректим должен разрешать метод POST (через Route::post), иначе фреймворк выдаст ошибку.
Спросите у пользователя email с помощью формы. Если этот email корректный, то выполните редирект на другое действие и выведите в представлении этого действия переданный email и сообщение о том, что он корректен.
Если же email не корректный, снова покажите форму, показав над ней сообщение о некорректности ввода.
Исключение полей формы
При редиректе можно исключать не нужные поля формы через except:
<?php
return redirect('адрес')->withInput($request->except('password'));
?>
Именованные маршруты и редирект
По следующей ссылке изучите раздел Именованные маршруты. Решите затем следующие задачи:
Сделайте именованный маршрут. Выполните на него редирект с другого действия.
Сделайте именованный маршрут с параметрами, например, /test/{param1}/{param2}. Выполните редирект на данный маршрут, передав при этом значения параметров.