최근에 새로운 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
어떤 이유로 작동하지 않음 다음이 추가 시도 $middleware
로Kernel.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
전체 선언 ( $middlewareGroups
Kernel.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도 추가했습니다.