Ich habe vor kurzem ein neues Laravel-Projekt erstellt und folgte dem Leitfaden zur Authentifizierung. Wenn ich meine Login- oder Registrierungsroute besuche, erhalte ich die folgende Fehlermeldung:
ErrorException in Request.php line 775:
Session store not set on request. (View: C:\Users\Matthew\Documents\test\resources\views\auth\register.blade.php)
Ich habe keine Kern-Laravel-Dateien bearbeitet, ich habe nur die Ansichten erstellt und die Routen meiner routes.php-Datei hinzugefügt
// 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']);
Ich habe nicht viel Erfahrung mit Laravel, entschuldigen Sie bitte meine Unwissenheit. Ich bin mir bewusst, dass eine andere Frage dasselbe verlangt, aber keine der Antworten scheint für mich zu funktionieren. Danke fürs Lesen!
Bearbeiten:
Hier ist mein register.blade.php wie gewünscht.
@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
Sie müssen die Web-Middleware verwenden, wenn Sie Sitzungsstatus, CSRF-Schutz und mehr benötigen.
Route::group(['middleware' => ['web']], function () {
// your routes here
});
Wenn das Hinzufügen Ihrer routes
im web middleware
aus irgendeinem Grund nicht funktioniert, versuchen Sie, dies zu $middleware
in Kernel.php
hinzuzufügen
protected $middleware = [
//...
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
];
In meinem Fall (unter Verwendung von Laravel 5.3) konnte ich durch das Hinzufügen der folgenden 2 Middleware auf die Sitzungsdaten meiner API-Routen zugreifen:
\App\Http\Middleware\EncryptCookies::class
\Illuminate\Session\Middleware\StartSession::class
Vollständige Deklaration ($middlewareGroups
in Kernel.php):
'api' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
'throttle:60,1',
'bindings',
],
Wenn die Antwort von Cas Bloem nicht zutrifft (d. H. Sie haben definitiv die web
-Middleware auf der entsprechenden Route), möchten Sie möglicherweise die Reihenfolge der Middlewares in Ihrem HTTP-Kernel überprüfen.
Die Standardreihenfolge in Kernel.php
lautet:
$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,
],
];
Beachten Sie, dass VerifyCsrfToken
hinter StartSession
steht. Wenn Sie diese in einer anderen Reihenfolge haben, kann die Abhängigkeit zwischen ihnen auch zur Session store not set on request.
-Ausnahme führen.
Laravel [5.4]
Meine Lösung war die Verwendung eines globalen Sitzungshelfer: session ()
Seine Funktionalität ist etwas schwieriger als $ request-> session ().
schreiben:
session(['key'=>'value']);
Drücken von:
session()->Push('key', $notification);
abrufen:
session('key');
Ein Problem kann sein, dass Sie versuchen, auf Ihre Sitzung innerhalb der __constructor()
-Funktion Ihres Controllers zuzugreifen.
Ab Laravel 5.3+ ist dies nicht mehr möglich, da es ohnehin nicht dazu gedacht ist, wie in der Upgrade-Anleitung angegeben .
In früheren Versionen von Laravel konnten Sie auf Sitzungsvariablen oder .__ zugreifen. der authentifizierte Benutzer im Konstruktor Ihres Controllers. Das war nie beabsichtigt, ein explizites Merkmal des Rahmens zu sein. In Laravel 5.3 Sie können nicht auf die Sitzung oder den authentifizierten Benutzer im Konstruktor Ihres Controllers zugreifen, da die Middleware noch nicht ausgeführt wurde.
Für weitere Hintergrundinformationen lesen Sie auch Taylor seine Antwort.
Problemumgehung
Wenn Sie dies dennoch verwenden möchten, können Sie eine Middleware dynamisch erstellen und im Konstruktor ausführen, wie in der Upgrade-Anleitung beschrieben:
Alternativ können Sie direkt eine Closure-basierte Middleware definieren im Konstruktor Ihres Controllers. Stellen Sie vor der Verwendung dieser Funktion sicher, dass dass Ihre Anwendung Laravel 5.3.4 oder höher ausführt:
<?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); }); } }
In meinem Fall habe ich $ middlewareGroups (in app/Http/Kernel.php) die folgenden 4 Zeilen hinzugefügt:
'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',
],
WICHTIG: Die 4 neuen Zeilen müssen VOR 'Gas' und 'Bindungen' hinzugefügt werden!
Andernfalls tritt der Fehler "CSRF-Token stimmt nicht überein" auf. Ich habe mehrere Stunden damit gekämpft, nur um herauszufinden, dass die Reihenfolge wichtig ist.
Dadurch konnte ich in meiner API auf die Sitzung zugreifen. Außerdem habe ich VerifyCsrfToken hinzugefügt, da CSRF bei Cookies/Sitzungen berücksichtigt werden muss.
Können Sie ->stateless()
vor der ->redirect()
verwenden? Dann brauchen Sie die Sitzung nicht mehr.
in meinem Fall war es nur zu setzen am ende der funktion, wo ich die session eingestellt habe
Wenn Sie CSRF verwenden, geben Sie 'before'=>'csrf'
ein.
In Ihrem Fall Route::get('auth/login', ['before'=>'csrf','uses' => 'Auth\[email protected]', 'as' => 'login']);
Weitere Informationen finden Sie in der Laravel 5-Dokumentation Sicherheitsschutzwege