[php] 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\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



답변

세션 상태, CSRF 보호 등이 필요한 경우 웹 미들웨어 를 사용해야합니다 .

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


답변

귀하의 추가하면 routes내부를 web middleware어떤 이유로 작동하지 않음 다음이 추가 시도 $middlewareKernel.php

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


답변

제 경우에는 (Laravel 5.3 사용) 다음 2 개의 미들웨어 만 추가하면 API 경로의 세션 데이터에 액세스 할 수 있습니다.

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

전체 선언 ( $middlewareGroupsKernel.php에서) :

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


답변

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.예외가 발생할 수도 있습니다 .


답변

컨트롤러의 기능 내에서 세션액세스 하려고하면 문제가 발생할 수 있습니다 .__constructor()

Laravel 5.3 이상부터는 업그레이드 가이드에 명시된 것처럼 어쨌든 작동하지 않기 때문에 더 이상 불가능합니다 .

이전 버전의 Laravel에서는 컨트롤러 생성자에서 세션 변수 또는 인증 된 사용자에 액세스 할 수있었습니다. 이것은 프레임 워크의 명시적인 기능을 의도 한 것이 아닙니다. Laravel 5.3에서는 미들웨어가 아직 실행되지 않았기 때문에 컨트롤러의 생성자에서 세션이나 인증 된 사용자에 액세스 할 수 없습니다.

더 많은 배경 정보는 Taylor 그의 답변을 읽어보십시오 .

해결 방법

그래도 사용하려면 업그레이드 가이드에 설명 된대로 미들웨어를 동적으로 만들고 생성자에서 실행할 수 있습니다.

대안으로 컨트롤러의 생성자에서 직접 클로저 기반 미들웨어를 정의 할 수 있습니다. 이 기능을 사용하기 전에 애플리케이션이 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);
        });
    }
}

답변

라 라벨 [5.4]

내 해결책은 전역 세션 도우미를 사용하는 것이 었습니다.
session ()

그 기능은 $ request-> session () 보다 약간 어렵습니다 .

쓰기 :

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

미는 :

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

검색 :

session('key');


답변

제 경우에는 $ middlewareGroups (app / Http / Kernel.php에서)에 다음 4 줄을 추가했습니다.

'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',
],

중요 : ‘throttle’및 ‘bindings’전에 4 개의 새 줄을 추가해야합니다!

그렇지 않으면 “CSRF 토큰이 일치하지 않음”오류가 발생합니다. 나는 순서가 중요하다는 것을 알기 위해 몇 시간 동안 이것을 고생했습니다.

이를 통해 API의 세션에 액세스 할 수있었습니다. 쿠키 / 세션이 관련 될 때 CSRF가 처리되어야하기 때문에 VerifyCsrfToken도 추가했습니다.