Фишки Laravel: не сохраняются сессии
Доброго времени суток. В одном проекте, написанном на Laravel, столкнулся с проблемой: сессии при обновлении страницы не сохранялись. Так, как сроки поджимали не стал разбираться. И использовал стандартный метод сессий в php, через массив $_SESSION. Проект успешно сдал и решил вернуться к вопросу сессий в Laravel.
Описывать принцип работы с сессиями в Laravel я не буду. Данный вопрос отлично рассмотрен в документации по Laravel. Опишу суть проблемы и решение ее.
Проблема: не сохраняются сессии в Laravel
И так, проблема заключается в том, что сессии не сохраняются при обновлении страницы. По умолчанию, сессии в Laravel хранятся
storage\framework\sessions\
Как выглядит проблема. Создаем контроллер, например, MainController, создаем метод test. Вот как выглядит мой контроллер:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class MainController extends Controller { public function test(Request $request) { $request->session()->set('test','value'); dd($request->session()->get('test')); } }
Т.е. записываем в сессию с ключем «test» значение «value». А затем выводим значение сессии с ключем «test».
Не забываем про роуты:
Route::get('/', ['as' => 'home', 'uses' => 'MainController@test']);
Переходим по адресу «/» и видим сообщение «value». Теперь закомментируем строку в нашем контроллере:
$request->session()->set('test','value');
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class MainController extends Controller { public function test(Request $request) { //$request->session()->set('test','value'); dd($request->session()->get('test')); } }
Обновляем страницу (жмем F5) и видим, что значение «null».
Решение: сохранение сессий Laravel в файле
Первое, что я проверил – это права доступа для Laravel на папку
storage\framework\sessions\
Не помогло: файл не создавался. Полез копать дальше и вуаля. Для сохранения сессии в файле в Laravel необходимо не только сделать:
$request->session()->set('test','value');
А еще и:
$request->session()->save();
Правим наш контроллер:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class MainController extends Controller { public function test(Request $request) { $request->session()->set('test','value'); $request->session()->save(); dd($request->session()->get('test')); } }
Проверяем. О, в папке storage\framework\sessions\ появился файл. И для чистоты эксперимента комментируем строки в контроллере:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class MainController extends Controller { public function test(Request $request) { //$request->session()->set('test','value'); //$request->session()->save(); dd($request->session()->get('test')); } }
И проверяем, обновляем страницу. И видим, что сессия сохранилась.
P.S. Все оказалось банально просто. Для того, чтобы сохранить сессию в файл необходимо дополнительно выполнить
$request->session()->save();
Увы в официальной документации этого я не нашел.
Есть же документация, что баламутите народ.
http://laravel.su/docs/5.0/session
Используйте метод put и не надо будет ничего сохранять.
Возможно, не проверял. Спасибо за совет.
В последней версии Laravel 5.4.23 вообще выпилили set. Оставили только put, но и при использовании put у меня не сохраняется. Нужно делать $request->session()->save();
put тоже не работает, в документации его нет. Laravel 8 уже….
Без save() на сегодняшний день тоже не работает стабильно.
При том через middleware эта проблема у меня пропала.
Однако после нескольких часов глубокого изучения документации, сторонних сайтов и всех прилегающих тем, хочется узнать, от чего же эти дорогие душе разработчики забыли дописать чудесный метод.
Еще хочется спросить у тебя Ромчик, что же ты сам то не проверил перед тем как ссылку кидать. Нету там с версии 4.2 по 8 ничего похожего на save().
Убедись — https://laravel.com/docs/8.x/session
Переключатель версий удобный, справа сверху. А то вдруг.
И риторический вопрос… Почему данные все же записываются когда обращаешься к сессии разными способами, а потом так же перестает работать.
Автору темы огромное спасибо!
Ромчик Михаил.
Прошу прощения.
И еще, пол дня сидел, а наткнулся сразу на два решения проблемы за последние 5 минут… Хотя время покажет. Но я почти уверен. Работает пока что.
Причиной сбоя данной неприятности с сессиями является debugging helper dd()
Вот такая история. Нашел здесь — https://laracasts.com/discuss/channels/laravel/is-sessionsave-required-each-time-i-write-to-session
Альтернатива старый — var_dump()