Работа с флеш сообщениями в Laravel

По следующей ссылке изучите раздел Одноразовые данные.

Замечание: в документации не очевидно, что установленные через flash данные выводятся так же, как и обычные переменные сессии, вот так:

<?php echo $request->session()->get('status'); // выведется только один раз ?>

Просто выведутся они один раз, а при обновлении страницы их уже не будет. Такое удобно для показа информационных сообщений.

Сделайте два действия. В первом действии запишите флеш сообщение. При заходе на второе действие выведите это сообщение в представлении.

Флеш сообщения в формах

Пусть у нас есть форма, спрашивающая у пользователя его имя и возраст:

<form action=""> <input type="text" name="name"> <input type="text" name="age"> <input type="submit"> </form>

Давайте сделаем действие form, представлением которого будет наша форма:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class TestController extends Controller { public function form() { return view('test.form'); } } ?>

Напишем условие, проверяющее отправку формы:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class TestController extends Controller { public function form(Request $request) // выполним инъекцию Request { if ($request->has('name') and $request->has('age')) { // проверим отправку формы } return view('test.form'); } } ?>

Давайте теперь сделаем так, чтобы данные формы сохранились в сессию в виде флеш сообщения. Для этого используем метод flash объекта $request:

<?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('name') and $request->has('age')) { $request->flash(); } return view('test.form'); } } ?>

Теперь после отправки формы данные из этой формы сохранятся в сессию и будут доступны при следующем заходе на сайт на какое-нибудь действие.

Давайте, например, сделаем действие result, по заходу на которое и выведем данные нашей формы:

<?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('name') and $request->has('age')) { $request->flash(); } return view('test.form'); } public function result(Request $request) { // Здесь выведем данные формы } } ?>

Для того, чтобы получить сохраненные данные, у объекта $request есть метод old, параметром принимающий имя инпута, значение которого мы хотим получить.

Давайте сделаем так, чтобы метод result вывел на экран имя и возраст пользователя:

<?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('name') and $request->has('age')) { $request->flash(); } return view('test.form'); } public function result(Request $request) { return $request->old('name') . ' ' . $request->old('age'); } } ?>

Еще раз поясню, как это будет работать: изначально нужно зайти на действие form и отправить форму. После этого нужно зайти на действие result (например, просто вбив нужный URL в адресной строке браузера) - и мы увидим данные нашей формы.

Так как мы имеем дело с флеш сообщением, то данные формы покажутся только при первом заходе на действие result.

Сделайте два действия. В первом действии покажите пользователю форму, в которой будет 5 инпутов для ввода чисел. После отправки формы сохраните ее данные в флеш сообщение описанным способом и выполните редирект на второе действие. Во втором действии найдите сумму переданных чисел и выведите ее в представлении действия.

Исключение данных

Кроме метода flash, существуют еще методы flashOnly и flashExcept.

Метод flashOnly записывает в сессию указанные поля формы, а метод flashExcept записывает в сессию все поля, кроме указанных.

С подобными методами мы уже сталкивались ранее, поэтому не будем разбирать их подробнее.

Функция old

Вместо метода $request->old() можно использовать глобальную функцию old(), работающую аналогичным образом.

Данную функцию удобно использовать в представлениях для сохранения значения в инпутах после отправки.

Давайте посмотрим на практическом примере:

Пусть у нас опять есть форма, спрашивающая у пользователя его имя и возраст:

<form action=""> <input type="text" name="name"> <input type="text" name="age"> <input type="submit"> </form>

Пусть у нас также есть действие form, представлением которого является наша форма:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class TestController extends Controller { public function form(Request $request) { return view('test.form'); } } ?>

Наша форма показывается действием form и отправляется на это же действие. Однако, после отправки значения из инпутов пропадают.

Давайте сделаем так, чтобы эти значения сохранялись, чтобы пользователю не приходилось вводить их заново, например, чтобы отредактировать неправильный ввод.

Для сохранения данных в сессию вызовем в нашем действии метод flash объекта $request:

<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class TestController extends Controller { public function form(Request $request) { $request->flash(); // сохраняем ввод в сессию return view('test.form'); } } ?>

А в нашей форме каждому инпуту добавим атрибут value, значением которого будет служить функция old, параметром которой будет передаваться имя соответствующего инпута:

<form action=""> <input type="text" name="name" value="{{ old('name') }}"> <input type="text" name="age" value="{{ old('age') }}"> <input type="submit"> </form>

Пусть у вас есть какая-то форма. Сделайте так, чтобы значения не пропадали из этой формы после отправки.