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, я только создал представления и добавил маршруты к файлу route.php

// Authentication routes
Route::get('auth/login', ['uses' => 'Auth\[email protected]', 'as' => 'login']);
Route::post('auth/login', ['uses' => 'Auth\[email protected]', 'as' => 'login']);
Route::get('auth/logout', ['uses' => 'Auth\[email protected]', 'as' => 'logout']);

// Registration routes
Route::get('auth/register', ['uses' => 'Auth\[email protected]', 'as' => 'register']);
Route::post('auth/register', ['uses' => 'Auth\[email protected]', 'as' => 'login']);

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

Edit:

Здесь мой 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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

В моем случае (используя 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',
        ],

Ответ 4

Если ответ 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..

Ответ 5

Проблема может быть в том, что вы пытаетесь получить доступ к своему сеансу внутри функции контроллера __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 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);
        });
    }
}

Ответ 6

Laravel [5.4]

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

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

писать

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

толкая

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

извлечения:

session('key');

Ответ 7

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

Ответ 8

Если вы используете CSRF, введите 'before'=>'csrf'

В вашем случае Route::get('auth/login', ['before'=>'csrf','uses' => 'Auth\[email protected]', 'as' => 'login']);

Для более подробной информации смотрите документацию Laravel 5 Безопасность Защита маршрутов

Ответ 9

Можно ли использовать ->stateless() перед ->redirect(). Тогда вам больше не нужна сессия.

Ответ 10

В моем случае я добавил следующие 4 строки в $ middlewareGroups (в app/Http/Kernel.php):

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

ВАЖНО: 4 новых строки должны быть добавлены ПЕРЕД "газами" и "привязками"!

В противном случае возникнет ошибка "CSRF token not match". Я боролся за это в течение нескольких часов, чтобы понять, что заказ важен.

Это позволило мне получить доступ к сессии в моем API. Я также добавил VerifyCsrfToken, так как когда речь идет о файлах cookie/сессиях, нужно позаботиться о CSRF.