J'ai récemment créé un nouveau projet Laravel et suivais le guide sur l'authentification. Lorsque je visite mon itinéraire de connexion ou d'inscription, j'obtiens l'erreur suivante:
ErrorException in Request.php line 775:
Session store not set on request. (View: C:\Users\Matthew\Documents\test\resources\views\auth\register.blade.php)
Je n'ai modifié aucun fichier Laravel de base, j'ai seulement créé les vues et ajouté les routes à mon fichier 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']);
Je n'ai pas beaucoup d'expérience avec Laravel, alors excusez mon ignorance. Je suis conscient qu'il y a une autre question qui pose la même chose, mais aucune des réponses ne semble fonctionner pour moi. Merci d'avoir lu!
Éditer:
Voici mon register.blade.php comme demandé.
@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
Route::controllers([ 'auth' => 'Auth\AuthController', 'password' => 'Auth\PasswordController', ]);
Réponses:
Vous devrez utiliser le middleware Web si vous avez besoin d'un état de session, d'une protection CSRF, etc.
la source
php artisan key:generate
Si vous ajoutez votre
routes
intérieur duweb middleware
ne fonctionne pas pour une raison quelconque , essayez d' ajouter ceci à$middleware
enKernel.php
la source
Dans mon cas (en utilisant Laravel 5.3), l'ajout uniquement des 2 middlewares suivants m'a permis d'accéder aux données de session dans mes routes API:
\App\Http\Middleware\EncryptCookies::class
\Illuminate\Session\Middleware\StartSession::class
Déclaration complète (
$middlewareGroups
dans Kernel.php):la source
Si la réponse de Cas Bloem ne s'applique pas (c'est-à-dire que vous avez définitivement le
web
middleware sur la route applicable), vous voudrez peut-être vérifier l'ordre des middlewares dans votre noyau HTTP.L'ordre par défaut
Kernel.php
est le suivant:Notez que
VerifyCsrfToken
vient aprèsStartSession
. Si vous les avez dans un ordre différent, la dépendance entre eux peut également conduire à l'Session store not set on request.
exception.la source
Un problème peut être que vous essayez d' accéder à votre session à l'intérieur de la
__constructor()
fonction de votre contrôleur .À partir de Laravel 5.3+, cela n'est plus possible car il n'est pas prévu de fonctionner de toute façon, comme indiqué dans le guide de mise à niveau .
Pour plus d'informations, lisez également sa réponse de Taylor .
solution de contournement
Si vous souhaitez toujours l'utiliser, vous pouvez créer dynamiquement un middleware et l'exécuter dans le constructeur, comme décrit dans le guide de mise à niveau:
la source
Laravel [5.4]
Ma solution était d'utiliser l'assistant de session global: session ()
Sa fonctionnalité est un peu plus difficile que $ request-> session () .
écriture :
poussant :
récupération :
la source
Dans mon cas, j'ai ajouté les 4 lignes suivantes à $ middlewareGroups (dans app / Http / Kernel.php):
IMPORTANT: Les 4 nouvelles lignes doivent être ajoutées AVANT 'throttle' et 'bindings'!
Sinon, une erreur "jeton CSRF ne correspond pas" se produira. J'ai lutté pendant plusieurs heures pour trouver que l'ordre est important.
Cela m'a permis d'accéder à la session dans mon API. J'ai également ajouté VerifyCsrfToken car lorsque des cookies / sessions sont impliqués, CSRF doit être pris en charge.
la source
Pouvez-vous utiliser
->stateless()
avant le->redirect()
. Ensuite, vous n'avez plus besoin de la session.la source
dans mon cas c'était juste pour mettre retour; à la fin de la fonction où j'ai défini la session
la source
Si vous utilisez CSRF, entrez
'before'=>'csrf'
Dans ton cas
Route::get('auth/login', ['before'=>'csrf','uses' => 'Auth\AuthController@getLogin', 'as' => 'login']);
Pour plus de détails, consultez la documentation Laravel 5 Security Protecting Routes
la source
Ce n'est pas sur la documentation de laravel, j'ai mis une heure pour y parvenir:
Ma session n'a pas persisté jusqu'à ce que j'utilise la méthode "save" ...
la source
Le groupe middleware Web Laravel 5.3+ est automatiquement appliqué à votre fichier routes / web.php par RouteServiceProvider.
Sauf si vous modifiez le tableau kernel $ middlewareGroups dans un ordre non pris en charge, vous essayez probablement d'injecter des requêtes en tant que dépendance régulière du constructeur.
Utiliser la demande comme
au lieu de
la source
J'obtenais cette erreur avec Laravel Sanctum. Je l'ai corrigé en ajoutant
\Illuminate\Session\Middleware\StartSession::class,
auapi
groupe middleware dans Kernel.php, mais j'ai compris plus tard que cela "fonctionnait" parce que mes routes d'authentification étaient ajoutées auapi.php
lieu deweb.php
, donc Laravel utilisait le mauvais garde d'authentification.J'ai déplacé ces itinéraires ici
web.php
, puis ils ont commencé à fonctionner correctement avec leAuthenticatesUsers.php
trait:J'ai compris le problème après avoir reçu une autre erreur étrange à propos de
RequestGuard::logout()
n'existe pas.Cela m'a fait réaliser que mes routes d'authentification personnalisées appelaient des méthodes du trait AuthenticatesUsers, mais je ne les utilisais pas
Auth::routes()
pour l'accomplir. Ensuite, j'ai réalisé que Laravel utilise la protection Web par défaut et que cela signifie que les routes doivent être inclusesroutes/web.php
.Voici à quoi ressemblent mes paramètres maintenant avec Sanctum et une application Vue SPA découplée:
Kernel.php
config / auth.php
Ensuite , vous pouvez avoir des tests unitaires tels que celui -ci où la critique,
Auth::check()
,Auth::user()
etAuth::logout()
fonctionnent comme prévu avec config minimale et l' utilisation maximale deAuthenticatesUsers
etRegistersUsers
traits.Voici quelques-uns de mes tests unitaires de connexion:
TestCase.php
LoginTest.php
J'ai remplacé les méthodes
registered
etauthenticated
dans les traits d'authentification Laravel afin qu'elles renvoient l'objet utilisateur au lieu des 204 OPTIONS:Regardez le code du fournisseur pour les traits d'authentification. Vous pouvez les utiliser tels quels, ainsi que les deux méthodes ci-dessus.
Voici les actions Vuex de mon Vue SPA pour la connexion:
Il m'a fallu plus d'une semaine pour que les tests unitaires d'authentification de Laravel Sanctum + Vue SPA + dans le même domaine fonctionnent tous selon mes normes, alors j'espère que ma réponse ici pourra aider d'autres personnes à gagner du temps à l'avenir.
la source