web-dev-qa-db-fra.com

Laravel - Magasin de session non défini sur demande

J'ai récemment créé un nouveau projet Laravel et je suivais le guide sur l'authentification. Lorsque je visite mon itinéraire ou mon itinéraire, je reçois le message suivant:

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 principal, je n'ai créé que les vues et ajouté les itinéraires à 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 s'il vous plaît excusez mon ignorance. Je suis conscient qu'il y a une autre question qui demande la même chose, mais aucune des réponses ne semble fonctionner pour moi. Merci d'avoir lu!

Modifier:

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
81
mattrick

Vous aurez besoin d'utiliser le middleware web si vous avez besoin de l'état de session, de la protection CSRF, etc.

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

Si l'ajout de votre routes dans le web middleware ne fonctionne pour aucune raison, essayez d'ajouter ceci à $middleware dans Kernel.php

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

Dans mon cas (avec Laravel 5.3), l’ajout des deux middlewares suivants m’a permis d’accéder aux données de session dans mes routes d’API:

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

Déclaration entière ($middlewareGroups dans Kernel.php):

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

Si la réponse de Cas Bloem ne s’applique pas (c’est-à-dire que vous avez bien le middleware web sur la route applicable), vous pouvez 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, leur dépendance peut également conduire à l'exception Session store not set on request.

17

Laravel [5.4]

Ma solution a été d'utiliser l'assistant de session global: session ()

Sa fonctionnalité est un peu plus difficile que$ request-> session ().

l'écriture :

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

en poussant :

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

recherche :

session('key');
11
izzaki

Un problème peut être que vous essayez de accéder à votre session dans la fonction __constructor() de votre contrôleur.

Depuis 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 .

Dans les versions précédentes de Laravel, vous pouviez accéder aux variables de session ou l'utilisateur authentifié dans le constructeur de votre contrôleur. C'était jamais eu l'intention d'être une caractéristique explicite du cadre. À Laravel 5.3, vous ne pouvez pas accéder à la session ou à l'utilisateur authentifié dans le constructeur de votre contrôleur car le middleware n'a pas encore été exécuté.

Pour plus d’informations, lisez également Taylor sa réponse.

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:

Vous pouvez également définir directement un middleware basé sur la fermeture dans le constructeur de votre contrôleur. Avant d’utiliser cette fonction, assurez-vous que que votre application exécute Laravel 5.3.4 ou une version ultérieure:

<?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);
        });
    }
}
11
Daan

Dans mon cas, j'ai ajouté les 4 lignes suivantes à $ middlewareGroups (dans app/Http/Kernel.php):

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

IMPORTANT: Les 4 nouvelles lignes doivent être ajoutées AVANT 'Throttle' et 'bindings'!

Sinon, l'erreur "Le jeton CSRF ne correspond pas" va augmenter. Cela fait plusieurs heures que je me bats pour trouver que la commande est importante.

Cela m'a permis d'accéder à la session dans mon API. J'ai aussi ajouté VerifyCsrfToken car, lorsque des cookies/sessions sont impliqués, CSRF doit être pris en charge.

0
莊育銘

Pouvez-vous utiliser ->stateless() avant la ->redirect(). Alors vous n’avez plus besoin de la session.

0
Henrique Duarte

dans mon cas, c'était juste pour mettre. à la fin de la fonction où j'ai mis la session 

0

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 Laravel 5 Documentation Sécurité pour la protection des itinéraires

0