Я попробовал запустить следующий код:
Session::put('progress', '5%'); dd(Session::get('progress'));
Это покажет «5%» в дампе.
Если я повторно запустил ту же страницу, но закомментирую Session::put('progress', '5%');
так что вызывается только строка dd()
, я получаю нулевое значение вместо 5% значений, сохраненных в предыдущей загрузке страницы.
Вот моя конфигурация сеансов, поэтому я знаю, что она должна хранить данные:
'driver' => 'native', 'lifetime' => 120, 'expire_on_close' => false,
Почему Laravel не хранит данные сеанса на разных страницах?
Проблема заключается в том, что вы убиваете скрипт до того, как Laravel завершит жизненный цикл приложения, поэтому значения, введенные в сеанс (но еще не сохраненные), также были убиты.
Когда начинается жизненный цикл приложения Laravel, любое значение, put
в Session
еще не сохраняется до окончания жизненного цикла приложения. То есть, когда любое значение, put
в Session
будет окончательно / действительно stored
.
Если вы проверите источник, вы найдете такое же вышеупомянутое поведение:
public function put($key, $value) { $all = $this->all(); array_set($all, $key, $value); $this->replace($all); }
Если вы хотите протестировать его, выполните следующие действия:
Храните значение в сеансе, не убивая скрипт.
Route::get('test', function() { Session::put('progress', '5%'); // dd(Session::get('progress')); });
Получить уже сохраненное значение:
Route::get('test', function() { // Session::put('progress', '5%'); dd(Session::get('progress')); });
Ответ Рубенса Мариуццо очень хорош. Я просто хочу добавить, что если вам нужны данные, которые нужно сохранить немедленно, вы можете использовать метод save:
Session::put('progress', '5%'); Session::save();
Для меня даже после правильной записи данных на сеанс:
dd(Session::all());
ничего не возвращает, но:
print_r(Session::all());
возвращает все данные сеанса!
В моем случае я свернул переменную в один запрос, а затем поместил ее в сеанс в другом запросе (с тем же именем).
К сожалению, завершающий метод прошел через все ранее свернутые свойства и очистил мое вновь созданное свойство сеанса (он был покраснел в предыдущем запросе, поэтому laravel считал, что он больше не нужен и не мог сказать, что он был недавно создан). Я понял, что отлаживает Kernel->terminateMiddleware
. Вы можете поставить точку останова в методе завершения. На каком-то этапе он достигает Store->ageFlashData
. Это метод, который отвечает за удаление моего свойства.