2015-03-30 2 views
8

Вот config/session.php:Laravel 5 - сессия не работает

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 пуст.

Что делать, чтобы сеанс работал?

+1

Кто является владельцем 'storage/framework/sessions'? '755' означает, что владелец может писать только в каталог. Поэтому для этих разрешений для работы владелец чаще всего должен быть пользователем веб-сервера, который в общем-то похож на 'www-data',' apache' и т. Д., В зависимости от того, какой дистрибутив Linux и HTTP-сервер вы используете. – Bogdan

+0

Попробуйте установить его на '775' вместо – lukasgeiter

+0

@Bogdan Я думаю, что речь идет не о разрешениях, а' 777', а сеанс по-прежнему не работает. –

ответ

17

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')); запрос прерывается до того, как можно вызвать метод промежуточного программного обеспечения terminate.

достаточно странно, то Laravel Middleware Documentation фактически объясняет расторгнуты Middleware логику, давая Laravel StartSession промежуточное программное обеспечение в качестве примера:

Например, «сеанс» промежуточного программного обеспечения в комплекте с Laravel записывает данные сеанса для хранения после ответ отправлен в браузер.

Для этого необходимо использовать var_dump() вместо dd().

+0

Большое вам спасибо! –

+0

Добро пожаловать. – Bogdan

+1

@limonte. Ваша проблема была достаточно интересной, и я решил немного поработать, чтобы понять точную причину. Я обновил ответ с более подробным объяснением того, что на самом деле происходит. – Bogdan

Смежные вопросы