Laravel – хранилище сеансов, не заданное по запросу

Недавно я создал новый проект Laravel и следил за руководством по аутентификации. Когда я посещаю либо мой логин или регистрационный маршрут, я получаю следующую ошибку:

ErrorException in Request.php line 775: Session store not set on request. (View: C:\Users\Matthew\Documents\test\resources\views\auth\register.blade.php) 

Я не редактировал никаких основных файлов Laravel, я только создал представления и добавил маршруты в файл routes.php

 // Authentication routes Route::get('auth/login', ['uses' => 'Auth\AuthController@getLogin', 'as' => 'login']); Route::post('auth/login', ['uses' => 'Auth\AuthController@postLogin', 'as' => 'login']); Route::get('auth/logout', ['uses' => 'Auth\AuthController@getLogout', 'as' => 'logout']); // Registration routes Route::get('auth/register', ['uses' => 'Auth\AuthController@getRegister', 'as' => 'register']); Route::post('auth/register', ['uses' => 'Auth\AuthController@postRegister', 'as' => 'login']); 

У меня нет большого опыта работы с Ларавелом, поэтому, пожалуйста, извините мое невежество. Я знаю, что есть еще один вопрос, задающий эту же проблему, но ни один из ответов, похоже, не работает для меня. Спасибо за прочтение!

Редактировать:

Вот мой register.blade.php по запросу.

 @extends('partials.main') @section('title', 'Test | Register') @section('content') <form method="POST" action="/auth/register"> {!! csrf_field() !!} <div class="ui input"> <input type="text" name="name" value="{{ old('name') }}" placeholder="Username"> </div> <div class="ui input"> <input type="email" name="email" value="{{ old('email') }}" placeholder="Email"> </div> <div class="ui input"> <input type="password" name="password" placeholder="Password"> </div> <div class="ui input"> <input type="password" name="password_confirmation"placeholder="Confirm Password"> </div> <div> <button class="ui primary button" type="submit">Register</button> </div> </form> @endsection 

Related of "Laravel – хранилище сеансов, не заданное по запросу"

Вам нужно будет использовать сетевое промежуточное программное обеспечение, если вам нужно состояние сеанса, защита CSRF и т. Д.

 Route::group(['middleware' => ['web']], function () { // your routes here }); 

Если добавление ваших routes внутри web middleware не работает по какой-либо причине, попробуйте добавить это к $middleware Kernel.php в Kernel.php

 protected $middleware = [ //... \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, ]; 

Если ответ Cas Bloem не применим (т. Е. Вы определенно получили web промежуточное ПО на соответствующем маршруте), вы можете проверить порядок посредников в своем HTTP-ядре.

Порядок по умолчанию в Kernel.php следующий:

 $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, ], ]; 

Обратите внимание, что VerifyCsrfToken появляется после StartSession . Если вы получили их в другом порядке, зависимость между ними также может привести к тому, что Session store not set on request. исключение.

В моем случае (используя Laravel 5.3) добавление только двух промежуточных программ позволило мне получить доступ к данным сеанса на моих маршрутах API:

  • \App\Http\Middleware\EncryptCookies::class
  • \Illuminate\Session\Middleware\StartSession::class

Целая декларация ( $middlewareGroups в Kernel.php):

 'api' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Session\Middleware\StartSession::class, 'throttle:60,1', 'bindings', ], 

Ларавел [5.4]

Мое решение состояло в том, чтобы использовать глобальный помощник сессии : session ()

Его функциональность немного сложнее, чем $ request-> session () .

письмо :

 session(['key'=>'value']); 

толкание :

 session()->push('key', $notification); 

получение :

 session('key'); 

Проблема может заключаться в том, что вы пытаетесь получить доступ к сеансу внутри функции __constructor() вашего контроллера.

Из Laravel 5.3+ это невозможно, потому что он не предназначен для работы в любом случае, как указано в руководстве по обновлению .

В предыдущих версиях Laravel вы могли получить доступ к переменным сеанса или аутентифицированному пользователю в конструкторе вашего контроллера. Это никогда не предназначалось для явной черты структуры. В Laravel 5.3 вы не можете получить доступ к сеансу или аутентифицированному пользователю в конструкторе вашего контроллера, потому что промежуточное программное обеспечение еще не запущено.

Для получения дополнительной информации также читайте Тейлор его ответ.

Временное решение

Если вы все еще хотите использовать это, вы можете динамически создать промежуточное программное обеспечение и запустить его в конструкторе, как описано в руководстве по обновлению:

В качестве альтернативы вы можете определить промежуточное ПО, основанное на Closure, непосредственно в конструкторе вашего контроллера. Прежде чем использовать эту функцию, убедитесь, что в вашем приложении работает Laravel 5.3.4 или выше:

 <?php namespace App\Http\Controllers; use App\User; use Illuminate\Support\Facades\Auth; use App\Http\Controllers\Controller; class ProjectController extends Controller { /** * All of the current user's projects. */ protected $projects; /** * Create a new controller instance. * * @return void */ public function __construct() { $this->middleware(function ($request, $next) { $this->projects = Auth::user()->projects; return $next($request); }); } } 

в моем случае это было просто вернуть возвращение; в конце функции, где я установил сеанс