Данные сеанса Laravel не привязаны к загрузке страниц

Я попробовал запустить следующий код:

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); } 

Если вы хотите протестировать его, выполните следующие действия:

  1. Храните значение в сеансе, не убивая скрипт.

     Route::get('test', function() { Session::put('progress', '5%'); // dd(Session::get('progress')); }); 
  2. Получить уже сохраненное значение:

     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 . Это метод, который отвечает за удаление моего свойства.