Laravel-boutique Session non définie sur demande
j'ai récemment créé un nouveau projet Laravel et je suivais le guide sur L'authentification. Lorsque je visite mon chemin de connexion ou d'enregistrement, j'obtiens l'erreur suivante:
ErrorException in Request.php line 775:
Session store not set on request. (View: C:UsersMatthewDocumentstestresourcesviewsauthregister.blade.php)
Je n'ai pas édité les fichiers de base de Laravel, Je n'ai créé que les vues et ajouté les routes à mes routes.fichier php
// Authentication routes
Route::get('auth/login', ['uses' => 'AuthAuthController@getLogin', 'as' => 'login']);
Route::post('auth/login', ['uses' => 'AuthAuthController@postLogin', 'as' => 'login']);
Route::get('auth/logout', ['uses' => 'AuthAuthController@getLogout', 'as' => 'logout']);
// Registration routes
Route::get('auth/register', ['uses' => 'AuthAuthController@getRegister', 'as' => 'register']);
Route::post('auth/register', ['uses' => 'AuthAuthController@postRegister', 'as' => 'login']);
Je n'ai pas beaucoup D'expérience avec Laravel, alors veuillez excuser mon ignorance. Je sais qu'il y a un autre question demander la même chose, mais aucune des réponses ne semble fonctionner pour moi. Merci pour la lecture!
Edit:
voici ma caisse.lame.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
8 réponses
vous aurez besoin d'utiliser le web middleware si vous avez besoin de session state, CSRF protection, et plus.
Route::group(['middleware' => ['web']], function () {
// your routes here
});
Si ajouter votre routes
à l'intérieur du web middleware
ne fonctionne pas pour n'importe quelle raison alors essayez d'ajouter ceci à $middleware
dans Kernel.php
protected $middleware = [
//...
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
];
dans mon cas (en utilisant Laravel 5.3) l'ajout seulement 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 le noyau.php):
'api' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
'throttle:60,1',
'bindings',
],
si la réponse de cas Bloem ne s'applique pas (c.-à-d. que vous avez certainement le middleware web
sur la route applicable), vous pourriez vouloir vérifier l'ordre des middlewares dans votre noyau HTTP.
l'ordre par défaut dans Kernel.php
est le suivant:
$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,
],
];
notez que VerifyCsrfToken
vient après StartSession
. Si vous les avez dans un ordre différent, la dépendance entre eux peut aussi conduire à l'exception Session store not set on request.
.
Laravel [5.4]
ma solution était d'utiliser l'aide de session globale: session()
sa fonctionnalité est un peu plus difficile que $request->session () .
écrit :
session(['key'=>'value']);
pousser :
session()->push('key', $notification);
"151940920 de" récupération :
session('key');
un problème peut être que vous essayez d'accéder à votre session à l'intérieur de la fonction __constructor()
de votre contrôleur.
de Laravel 5.3+ ce 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 .
dans les versions précédentes de Laravel, vous pouvez accéder aux variables de session ou l'utilisateur authentifié dans votre constructeur du contrôleur. Ce être jamais été destiné à être explicite d'une fonction de cadre. Dans Laravel 5.3, vous ne pouvez pas accéder à la session ou à l'utilisateur authentifié dans le constructeur de votre controller car le middleware n'a pas encore été lancé.
pour plus de renseignements généraux, lire aussi Taylor sa réponse.
contournement
si vous voulez toujours utiliser ceci, vous pouvez dynamiquement créer un middleware et l'exécuter dans le constructeur, comme décrit dans le guide de mise à niveau:
comme alternative, vous pouvez définir un middleware basé sur la fermeture directement dans le constructeur de votre contrôleur. Avant d'utiliser cette fonction, assurez-vous que votre application utilise Laravel 5.3.4 ou plus:
<?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); }); } }
dans mon cas, c'était juste pour mettre les retourner ; à la fin de la fonction où j'ai fixé la session
si vous utilisez CSRF entrez 'before'=>'csrf'
dans votre cas
Route::get('auth/login', ['before'=>'csrf','uses' => 'Auth\AuthController@getLogin', 'as' => 'login']);
pour plus de détails voir la Documentation de Laravel 5 routes de sécurité