return [ 'driver' => 'file', 'files' => storage_path().'/framework/sessions', ];
Мои storage/framework/sessions
имеют 755 разрешений.
Когда я помещаю эти 2 строки в свой контроллер
Session::set('aa', 'bb'); dd(Session::get('aa'));
Я получаю ожидаемый вывод "bb"
. Но если я прокомментирую первую строку:
// Session::set('aa', 'bb'); dd(Session::get('aa'));
и обновить страницу, я все еще ожидаю "bb"
но получаю null
.
Кроме того, storage/framework/sessions
пустые.
Что мне нужно сделать для работы сеанса?
Laravel 5 обрабатывает сеансы через класс промежуточного ПО StartSession
. Что еще более важно, это промежуточное ПО представляет собой TerminableMiddleware
а код, который фактически сохраняет данные (в вашем случае для файла сеанса), находится в методе terminate
, который запускается в конце жизненного цикла запроса:
public function terminate($request, $response) { if ($this->sessionHandled && $this->sessionConfigured() && ! $this->usingCookieSessions()) { $this->manager->driver()->save(); } }
При вызове dd(Session::get('aa'));
запрос прерывается до того, как может быть вызван метод завершения промежуточного программного обеспечения.
Как ни странно, документальная документация Laravel Middleware фактически объясняет логику Terminable Middleware, предоставив промежуточное ПО Laravel StartSession
в качестве примера:
Например, промежуточное программное обеспечение «сеанс», включенное в Laravel, записывает данные сеанса в хранилище после того, как ответ отправлен в браузер.
При этом попробуйте использовать var_dump()
вместо использования dd()
.