2015-04-22 15 views
7

Sto cercando di lavorare con Sessioni nel middleware Laravel 5, ma non funzionano. Per essere precisi - var_dump(Session::all()); all'inizio del metodo di impugnatura mi dà array con un valore - _tokken, poi alla fine di questo metodoSessione non funzionante nel middleware Laravel 5

Session::put('lang',$locale); 
var_dump(Session::all()); 

mi dà array con due valori, _tokken e la mia chiave Lang, ma dopo aggiornare lo stesso, come ho capito ci dovrebbe essere lo stesso risultato dopo il secondo aggiornamento.

Ho anche se forse ho il mio middleware caricato prima sessione middleware, il che era vero, poi sono passato e ora il mio Kernel.php assomiglia a questo -

protected $middleware = [ 
     'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode', 
     'Illuminate\Cookie\Middleware\EncryptCookies', 
     'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse', 
     'Illuminate\Session\Middleware\StartSession', 
     'Illuminate\View\Middleware\ShareErrorsFromSession', 
     'App\Http\Middleware\VerifyCsrfToken', 
     'App\Http\Middleware\Language', 

    ]; 

Quindi chiedo - che cosa faccio di sbagliato?

Edit: Scavando nella Illuminate \ Session \ Middleware \ StartSession Ho trovato questo -

//Note that the Laravel sessions do not make use of PHP "native" sessions in any way since they are crappy. 

come un commento, quindi il mio test con session_status() non è relavent.

+0

Ho appena rimosso la mia risposta perché non era corretta. Ho testato '' Session :: all() '' nel middleware del mio progetto e funziona perfettamente. Ci scusiamo per la risposta sbagliata. –

+0

@limonte no worries, sì ho scritto che Session :: all() restituisce _token, ma non più tardi imposta il mio valore – Subject

+0

per me funziona come previsto, cioè _token, _previous e i miei valori personalizzati –

risposta

5

è necessario utilizzare

\Session::save(); 

Ogni volta che si desidera salvare la modifica in modo Diciamo che voglio per memorizzare la lingua dell'utente

\Session::put('lang','en'); 
\Session::save(); 

Quando si aggiorna ora troverete la vostra nuova chiave creata.

+0

Questo metodo 'save' non è necessario in Laravel 5.2 – Daan

+1

A volte è necessario. Se si esegue 'redirect() -> route ('myroute') -> send()', non memorizza i dati di sessione, quindi è necessario aggiungere 'Session :: save();' before. –

+0

questo non ha aiutato –

0

Un'altra cosa da notare, se stai realizzando un middleware che manipola/recupera i dati dalla sessione, devi assicurarti che sia caricato dopo il middleware web StartSession.

4

Ho avuto lo stesso problema, stavo usando Sessioni per memorizzare le impostazioni locali all'accesso, quindi reindirizzare alla dashboard principale, ma quando il middleware viene caricato, la sessione non è ancora iniziata. Quindi non funzionerebbe.

Innanzi tutto vorrei dire, io non sono esperto laravel, ma in questo modo funziona in laravel 5.3:

1) php artigianale marca: middleware SetApplicationLanguage

2) Aggiungere questo per app/HTTP/Kernel .php $ middlewareGroup variabile:

\Illuminate\Session\Middleware\StartSession::class, 
\App\Http\Middleware\SetApplicationLanguage::class, 

Si noti che questo nuovo middleware viene dopo la classe StartSession.

3) Questa è la mia app/Http/middleware/SetApplicationLanguage.php:

namespace App\Http\Middleware; 

use App; 
use Closure; 
use Illuminate\Support\Facades\Auth; 

class SetApplicationLanguage 
{ 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request    
    * @param \Closure $next    
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if (isset(Auth::user()->locale)) { 
      App::setLocale(Auth::user()->locale); 
     } 

     return $next($request); 
    } 
} 

Si noti che io non uso sessione in esso questo esempio. Questo perché quando aggiungo il mio middleware DOPO la classe StartSession, la sessione funzionerebbe, ma Auth :: user() sarebbe di nuovo disponibile, quindi potrei semplicemente usare Auth :: user() -> locale e non c'è bisogno di Sessioni.

Ma si potrebbe fare, basta usare App :: setLocale (Session :: get ('locale')) invece e di causa includere la facciata della Sessione.

0

Ho avuto lo stesso problema, stavo impostando valore nel middleware e disinserendo nello stesso posto se alcune condizioni sono vere.

Mi sono completamente dimenticato di 404s, alcuni file stavano acquisendo 404 (immagini mancanti), quindi nginx stava passando la richiesta all'app Laravel per mostrare la pagina 404, e poiché era un altro url, mi stavo mettendo da parte. Penso che sia lo stesso problema con l'archiviazione di materiale linguistico in sessione. Basta controllare la rete del tuo browser e vedere quali richieste vengono fatte durante il caricamento della pagina, potresti impostare e disinserire allo stesso tempo

Problemi correlati