Фишки Laravel: не сохраняются сессии

Ромчик
6

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

Увы в официальной документации этого я не нашел.

Понравилась статья? Поделись с друзьями.
  • Add to favorites
  • Добавить ВКонтакте заметку об этой странице
  • Twitter
  • Facebook
  • Мой Мир
  • LiveJournal
  • Одноклассники
  • Блог Я.ру
  • MySpace
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • Reddit
  • StumbleUpon
  • Technorati
  • del.icio.us
  • БобрДобр
  • LinkedIn
  • Memori.ru
  • Сто закладок
  • Blogger

  • Михаил - 23.05.2017 в 10:04

    Есть же документация, что баламутите народ.
    http://laravel.su/docs/5.0/session
    Используйте метод put и не надо будет ничего сохранять.

    • Ромчик - 23.05.2017 в 10:07

      Возможно, не проверял. Спасибо за совет.

    • Ромчик - 01.06.2017 в 09:43

      В последней версии Laravel 5.4.23 вообще выпилили set. Оставили только put, но и при использовании put у меня не сохраняется. Нужно делать $request->session()->save();

    • Евгений - 22.11.2020 в 22:29

      put тоже не работает, в документации его нет. Laravel 8 уже….
      Без save() на сегодняшний день тоже не работает стабильно.
      При том через middleware эта проблема у меня пропала.
      Однако после нескольких часов глубокого изучения документации, сторонних сайтов и всех прилегающих тем, хочется узнать, от чего же эти дорогие душе разработчики забыли дописать чудесный метод.
      Еще хочется спросить у тебя Ромчик, что же ты сам то не проверил перед тем как ссылку кидать. Нету там с версии 4.2 по 8 ничего похожего на save().
      Убедись — https://laravel.com/docs/8.x/session
      Переключатель версий удобный, справа сверху. А то вдруг.
      И риторический вопрос… Почему данные все же записываются когда обращаешься к сессии разными способами, а потом так же перестает работать.
      Автору темы огромное спасибо!

  • Евгений - 22.11.2020 в 22:32

    Ромчик Михаил.
    Прошу прощения.

  • Евгений - 22.11.2020 в 22:42

    И еще, пол дня сидел, а наткнулся сразу на два решения проблемы за последние 5 минут… Хотя время покажет. Но я почти уверен. Работает пока что.
    Причиной сбоя данной неприятности с сессиями является debugging helper dd()
    Вот такая история. Нашел здесь — https://laracasts.com/discuss/channels/laravel/is-sessionsave-required-each-time-i-write-to-session
    Альтернатива старый — var_dump()

  • ©2012-2020 По всем вопросам обращайтесь через форму обратной связиПолитика конфиденциальности

    Яндекс.Метрика