Laravel 5 встроена полезная функция redirect()
для редиректа пользователей на различные страницы и действия с и без данных. Давайте рассмотрим эти различные способы редиректов, возможно, вы откроете для себя что-либо новое.
Во всех примерах мы будем использовать редиректы так, словно они являются возвращаемым результатом в методах контроллера.
Простой редирект
Здесь всё достаточно тривиально — например, наш сайт находится на доменеwww.website.com
, редирект перенаправит его на домен + то, что вы укажете в параметре:
Редирект на www.website.com/homepage
return redirect('homepage');
Редирект на www.website.com/auth/login
:
return redirect('auth/login');
Редирект на главную страницу:
return redirect('');
Цепочки методов и редирект назад
Если вы хотите перенаправить пользователя назад, на предыдущую страницу, можно воспользоваться методом back()
:
return redirect()->back();
Таким образом вы можете создавать цепочки методов к функции redirect()
.
Редирект с данными
Есть два способа передачи данных при редиректе. Первым является метод with()
:
return redirect()->back()->with('error', 'Something went wrong.');
Этот код добавит в сессию переменную с ключом error
и значением Something went wrong
, и вы сможете получить к ней доступ во вьюхе с помощью session('error')
. Переменная стирается из сессии при следующем запросе.
Вы также можете добавить несколько методов with()
подряд:
return redirect()->back()->with('error', 'Something went wrong.')->with('order_value', $value);
Но более предпочтительным методом будет использование массива:
$parameters = ['error' => 'Something went wrong.', 'order_value' => $value];
return redirect()->back()->with($parameters);
Если вы возвращаете пользователя назад, к форме, то можно использовать методwithInput()
:
return redirect()->back()->withInput();
Этот метод используется без параметров и сохраняет данные формы в сессии. Затем в форме вы можете получить доступ к значениям при помощи функции old($key)
.
Редирект к роуту
Если в вашем файле роутов указаны роуты с именами, вы можете редиректить пользователя к конкретному роуту:
app/Http/routes.php
:
get('books', ['as' => 'books_list', 'uses' => 'BooksController@index']);
app/Http/Controllers/SomeController.php
:
return redirect()->route('books_list');
Это очень полезно, если вы в будущем захотите поменять структуру URL — вам не нужно будет менять ни контроллеры, ни вьюхи, а только файл роутов.
Также вы можете указать параметры к роуту, если они есть:
app/Http/routes.php
:
get('book/{id}', ['as' => 'book_view', 'uses' => 'BooksController@show']);
app/Http/Controllers/SomeController.php
:
return redirect()->route('book_view', 1);
Если параметров несколько, то можно использовать массив:
app/Http/routes.php
:
get('book/{category}/{id}', ['as' => 'book_view', 'uses' => 'BooksController@show']);
app/Http/Controllers/SomeController.php
:
return redirect()->route('book_view', [513, 1]);
Также можно указать параметрам ключи:
return redirect()->route('book_view', ['category'=>513, 'id'=>1]);
Редирект к методу контроллера
И, наконец, мы можем редиректить пользователя к конкретному методу контроллера:
return redirect()->action('App\Http\Controllers\BooksController@index');
Также вы можете указать параметры для метода контроллера:
return redirect()->action('App\Http\Controllers\BooksController@show', [1]);
Заключение
Вот, в принципе, и всё, что нужно знать о редиректах в Laravel. Самое главное — это не редиректить пользователя на ту же страницу/действие бесконечным циклом. :)