Intereting Posts

Мой Laravel 5.2.10 Сессии не сохраняются

У меня есть новая установка Laravel 5, на самом деле я пробовал это на нескольких версиях и продолжаю сталкиваться с той же проблемой.

Я ничего не менял по умолчанию, за исключением того, что для драйвера сеанса был добавлен redis. (У файла также есть такая же проблема).

У меня есть два маршрута, заданные следующим образом

Route::get('/set/{value}', function($value) { var_dump(Session::getId()); Session::set('test', $value); return view('welcome'); }); Route::get('/get', function() { return 'Get ' . Session::get('test'); }); 

Если я посещаю url / set / abc, я вижу, что сеанс отображается в REDIS (я также вижу файл, созданный при использовании файла). Сессия выглядит отлично в REDIS, как показано ниже

 127.0.0.1:6379> KEYS * 1) "laravel:1a3ae6caff6346e4a173fdc1ab4c6eb0f138806b" 2) "laravel:fed1af2fb44c6e625953237c3fa6fcbb05366a5c" 3) "laravel:cb37286ccfe3e7caa20557aca840f50cb5a5f20d" 

Каждый раз, когда я посещаю страницу, она воссоздает новый сеанс.

Ключевыми частями файла session.php являются:

 'lifetime' => 120, 'expire_on_close' => false, 

Я также проверил в REDIS TTL переменных сеанса, и они инициализируются через 120 минут (эквивалент в секундах).

Любая идея, что я делаю неправильно?

Возможно, стоит отметить, что я использую усадьбу vm (полный запас), чтобы проверить это. Я также пытался использовать несколько браузеров. Никакие файлы cookie никогда не отправляются в браузер, я полагаю, что идентификатор сеанса должен быть отправлен в браузер как часть первоначального запроса на получение запроса?

Класс промежуточного ПО Laravel \Illuminate\Session\Middleware\StartSession отвечает за запуск сеанса. До L5.2 это выполнялось по каждому запросу, поскольку оно было частью глобального промежуточного стека. Теперь это необязательно, поскольку L5.2 хочет разрешить как веб-интерфейс, так и API в одном приложении.

Если вы откроете app/Http/Kernel.php , вы увидите, что промежуточное ПО StartSession является частью промежуточной группы, называемой web . Вы должны поместить все свои маршруты туда, чтобы ваш пример работал.

 Route::group(['middleware' => ['web']], function () { Route::get('/set/{value}', function($value) { var_dump(Session::getId()); Session::set('test', $value); return view('welcome'); }); Route::get('/get', function() { return 'Get ' . Session::get('test'); }); }); 

Вы можете видеть, что группа промежуточного программного обеспечения также отвечает за другие вещи, такие как предоставление переменной $errors во всех представлениях.

Вы можете узнать больше об этом в документах:

По умолчанию файл routes.php содержит один маршрут, а также группу маршрутов, которая применяет группу промежуточного программного обеспечения для всех маршрутов, которые она содержит. Эта промежуточная группа обеспечивает состояние сеанса и защиту CSRF для маршрутов.

Любые маршруты, не помещенные в группу промежуточного программного обеспечения web , не будут иметь доступа к сеансам и защите CSRF, поэтому убедитесь, что все маршруты, которые нуждаются в этих функциях, помещаются внутри группы. Как правило, вы разместите большинство своих маршрутов в этой группе:

Источник: https://laravel.com/docs/5.2/routing