2016-03-29 13 views
6

Ich versuche Flash-Messaging mit Sitzungen zu implementieren, bin aber nicht dazu in der Lage.Laravel 5.2 Session-Flash funktioniert nicht einmal mit Web-Middleware

In meinem Controller habe ich:

public function store(Request $request) { 
    session()->flash('donald', 'duck'); 
    session()->put('mickey', 'mouse'); 
    return redirect()->action('[email protected]')->with('bugs', 'bunny'); 
} 

Aber wenn ich die Session-Variablen in der Ansicht zu überprüfen, kann ich nur die Werte von session()->put('mickey', 'mouse') sehen.

Session:

{"_token":"F6DoffOFb17B36eEJQruxvPe0ra1CbyJiaooDn3F","_previous":{"url":"http:\/\/localhost\/customers\/create"},"flash":{"old":[],"new":[]},"mickey":"mouse"} 

Viele Menschen begegnet dieses Problem, indem nicht in der Web-Middleware die entsprechenden Routen haben. Ich habe das auch gemacht, aber es würde immer noch nicht funktionieren.

In routes.php:

Route::group(['middleware' => ['web']], function() { 

    Route::get('/', function() { 
     return view('welcome'); 
    }); 

    Route::get('/customers', '[email protected]'); 
    Route::get('/customers/create', '[email protected]'); 
    Route::post('/customers', '[email protected]'); 
}); 

In Kernel.php:

protected $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, 
    ], 

    'api' => [ 
     'throttle:60,1', 
    ], 
]; 

Kann mir jemand mitteilen, was ich hier falsch tun könnte? Vielen Dank!

+2

bitte den Code teilen, wie Sie Sitzung überprüfen. –

+0

Um die Sitzung zu überprüfen, fügte ich "" zu der Ansicht – howellmartinez

+0

, die kein System zum Überprüfen der Sitzung ist. –

Antwort

28

das Problem wurde behoben, durch

Route::group(['middleware' => ['web']], function() { 
    ... 
}); 

mit

Route::group(['middlewareGroups' => ['web']], function() { 
    ... 
}); 

Keine Ahnung ersetzen, warum dies allerdings funktioniert, wenn alle Unterlagen legt nahe, dass wir ['middleware' => ['web']]

+1

In Ihrem Fall funktioniert auch ['Middleware' => 'web']. Aber "Web" -Middleware funktioniert nicht, wenn wir eine Reihe von Middlewares geben. Obwohl es in keiner Dokumentation ist. – Sovon

+0

Ich bin mir ziemlich sicher, dass ich auch ['middleware' => 'web'] ausprobiert habe, aber es hat nicht funktioniert – howellmartinez

+1

Thaks zum Speichern meiner Zeit. Ich hatte das gleiche Problem wie Ihres. Sieht so aus, als ob die Dokumentation dazu da sein müsste. –

2

Ihre Session Flash-info Erstellen von diesem Code:

<?php 

Session::flash("Donald", "Duck") 
// Or in your code style. 
$request->session()->flash("Donald", "Duck") 
?> 

es Ihrer Ansicht nach Prüfen Sie mit:

@if(Session::has("Donald") 
    {{Session::get("Donald")}} 
@endif 

Sie vergessen $ Anfrage zu verwenden :)

+0

Danke für die Antwort, ich habe dies früher getestet und die Verwendung von $ Anfrage hat keinen Unterschied :(Soweit ich weiß, mit 'session()' ohne die ' $ request' ist gültig - derjenige ohne '$ request' ruft den' session() 'Helfer auf (laravel.com/docs/5.2/helpers#method-session). Außerdem erklärt es nicht, warum" Bugs ": "Hase" taucht nicht auf. – howellmartinez

1

In Controller:

use Session,Redirect; 

public function store(Request $request) 
{ 
Session::flash('donald', 'duck'); 
Session::put('mickey', 'mouse'); 
return Redirect::to('/customers')->with('bugs', 'bunny'); 
} 

I n 'view' überprüfen Sie die Daten erhält oder nicht:

<?php 
print_r($bugs);die; 
?> 

Good Luck :)

+0

Das ist genau meine Antwort ... – Chilion

+0

Er sagte, dass er nicht die "Bugs" bekommt, "Hase", dafür sollte er auf die richtige Route umleiten wie diese zurück Redirect :: to ('/ customers') -> with ('bugs', 'bunny'); Und deine Antwort ist auch korrekt. @Chilion – Sunil

+0

Sorry habe es mehrmals getestet und es funktioniert immer noch nicht.Obwohl es etwas komisches war, wo der 'Donald 'Schlüssel erschien in der Sitzung, aber ohne die' Ente 'Wert – howellmartinez

1

ich folgendes verwenden:

In meinem Controller:

public function xyz(){ 
    // code 

    // This 
    return redirect()->action('[email protected]')->with('success', 'Check! Everything done!'); 

    // Or this 
    return redirect('/index')->with('success', 'Check! Everything done!'); 
} 

Meiner Ansicht :

@if(session('success')) 
    {{ session('success') }} 
@endif 

Nichts sonst. Die Web-Middleware ist jeder Route zugeordnet.

+0

Ja, dieser Code sollte funktionieren, obwohl es sehr ungewöhnlich ist, dass ich es nicht bekomme. Ich habe ein anderes Laravel 5.2 Projekt mit ähnlichen Routen und Controllern und Sessions funktionieren gut. Für dieses Projekt habe ich sogar versucht, eine brandneue Installation zu machen, aber ich habe immer noch das gleiche Problem. – howellmartinez

5

verwenden Dies ist mehr als wahrscheinlich wegen Eine Änderung, die an dem Laravel-Framework (v5.2.27) vorgenommen wurde, dass alle Routen standardmäßig Teil der "Web" -Middleware sind, ordnen Sie sie in Ihrer routes.ph erneut zu p-Datei endet damit, dass sie zweimal zugewiesen wird.

Die Lösung ist, entweder die "Web" -Middleware von Ihren Routen zu entfernen ODER die automatische Zuweisung vom RouteServiceProvider zu entfernen.

Vor dem Laravel Update:

// RouteServiceProvider.php 
$router->group(['namespace' => $this->namespace], function ($router) { 
    require app_path('Http/routes.php'); 
}); 

Nach dem Laravel Update:

// RouteServiceProvider.php 
$router->group([ 
    'namespace' => $this->namespace, 'middleware' => 'web', 
], function ($router) { 
    require app_path('Http/routes.php'); 
}); 

Beachten Sie, wie das neue Update automatisch die "web" Middleware auf allen Strecken gilt. Entfernen Sie es einfach hier, wenn Sie Laravel 5.2 wie bisher weiterverwenden möchten (manuell "web" Middleware in Ihrer routes.php zuweisen).

+0

Das ist der Schlüssel! Danke. Ich habe Stunden damit verbracht. –

1

Ich weiß nicht, warum, aber unter Windows Sie müssen Änderungen in Ihrer Routen: Middleware middlewareGroups, wie folgt aus:

change middleware to middlewareGroups

in Ihrer App \ Kernel.php Also, müssen Sie die StartSession stellen zuerst auf Anordnung von Middleware-Gruppe Web:

put the StartSession at first on array of middleware group web

+0

Dies ist die eine, die für mich funktionierte. – Raza

Verwandte Themen