2015-12-23 16 views
9

Próbuję zaimplementować niestandardowe wiadomości flash i mam problemy z niszczeniem danych sesji po przekierowaniu.Dane sesji nie zostały zachowane po przekierowaniu.

Oto sposób tworzę moje wiadomości lampy błyskowej:

flash('Your topic has been created.'); 

Oto deklaracja funkcji flash():

function flash($message, $title = 'Info', $type = 'info') 
{ 
    session()->flash('flash', [ 
     'message' => $message, 
     'title' => $title, 
     'type' => $type,   
    ]); 
} 

A oto jak ja sprawdzanie sesji/wyświetlanie wiadomości bezpośrednie, używając SweetAlerts. Ten kod znajduje się u dołu głównego pliku układu, który rozwijam we wszystkich szablonach Blade.

@if(Session::has('flash')) 
    <script> 
     $(function(){ 
      swal({ 
       title: '{{ Session::get("flash.title") }}', 
       text : '{{ Session::get("flash.message") }}', 
       type : '{{ Session::get("flash.type") }}', 
       timer: 1500, 
       showConfirmButton: false,   
      }) 
     });   
    </script> 
@endif 

Powyższy kod będzie działać, jeśli I wywołać funkcję flash() przed wyświetleniem widoku, tak jak poniżej:

public function show($slug) 
{ 
    flash('It works!'); 
    return view('welcome'); 
} 

Jednak to nie będzie działać, jeśli zgłoszę go przed wykonaniem przekierowanie do innej strony , tak:

public function show($slug) 
{ 
    flash('It does not work'); 
    return redirect('/'); 
} 

Dlaczego dane sesji zostały utracone podczas przekierowania? Jak mogę sprawić, aby był on wyświetlany, aby móc wyświetlić moją wiadomość flash?

+0

Czy możesz sprawdzić adresy URL przed i po przekierowaniu? Czasem jesteś w domenie z 'www.'' i przekierowujesz do domeny bez' www.' iw tym przypadku nie zobaczysz sesji –

Odpowiedz

3

Okazuje się, że z laravel 5.2, trasy muszą być zapakowane w middleware internetowej dla sesja działał poprawnie.

Ten poprawiony:

Route::group(['middleware' => ['web']], function() { 
    // ... 
    Route::post('/topics/{slug}/answer', '[email protected]'); 
    Route::post('/topics/{slug}/unanswer', '[email protected]'); 
    Route::post('/topics/{slug}/delete', '[email protected]'); 
}); 
+2

Mam ten sam problem, ale to rozwiązanie nie działa dla mnie. – raphael

+0

dla wersji 5.2, czy sieć nie jest automatycznie stosowana do wszystkich tras? .. – CodeGuru

+1

@FlyingAtom Tak, to się zmieniło, ale w momencie, kiedy zadałem pytanie, musiałem to zrobić ręcznie. ;) – Drown

8

I okazało się, że konieczne jest zastosowanie pośredniej internetową na wszystkich trasach. Drown o tym wspominał, ale od 23 marca 2016 r. Taylor Otwell zmienił domyślną usługę RouteServiceProvider pod numerem https://github.com/laravel/laravel/commit/5c30c98db96459b4cc878d085490e4677b0b67ed

. Po tej zmianie oprogramowanie pośredniczące zostanie automatycznie zastosowane do wszystkich tras. Jeśli teraz zastosujesz go ponownie w swojej route.php, zobaczysz, że web pojawia się dwukrotnie na liście tras (php artisan route:list). To dokładnie sprawia, że ​​dane flash są odrzucane.

zobacz także: https://laracasts.com/discuss/channels/laravel/session-flash-message-not-working-after-redirect-route/replies/159117

+0

Dzięki, to był mój problem .. –

+0

niesamowite połówki, dziękuję – manix

1

Przekierowanie z danymi typu flash odbywa się to tak:

redirect("/blog")->with(["message"=>"Success!"]); 

W wczesne laravel 5,2 wersje, wszystkie dane Flash i Session są przechowywane tylko wtedy, gdy drogi są wewnątrz grupy web middleware.

Od laravel 5.2.34, wszystkie trasy są za pomocą internetowej middleware domyślnie. Jeśli ponownie umieścisz je w grupie oprogramowania warstwy pośredniej, dwukrotnie zastosujesz oprogramowanie pośrednie do sieci na trasach - takie trasy nie będą w stanie zachować danych Flash lub Session.

2

W Laravel 5.2.34 wszystkie trasy domyślnie korzystają z oprogramowania pośredniczącego WWW.

Dlatego to zmienić:

Route::group(['middleware' => ['web']], function() { // This will use 2 web middleware 

    // ... 

    Route::post('/foo', '[email protected]'); 

}); 

do tego:

Route::group([], function() { // This will use the default web middleware 

    // ... 

    Route::post('/foo', '[email protected]'); 

}); 

a następnie w kontrolerze można użyć:

class FooController extends Controller 
{ 
    ... 

    public foo() 
    { 
     ... 

     return redirect('/foo')->withSuccess('Success!!'); 
     // or 
     return redirect('/foo')->with(['success' => 'Success!!']); 
    } 

    ... 
} 
1

Problem miałem był Session::save() zapobiegania Swal od pokazywania po przekierowaniu.

0

Proszę sprawdzić APP/kernel.php

\Illuminate\Session\Middleware\StartSession::class,

jest zdefiniowanie wielokrotnie

protected $middleware = [ 
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, 
    \Illuminate\Session\Middleware\StartSession::class, 
    ]; 

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, 
     \Illuminate\Routing\Middleware\SubstituteBindings::class, 
    ], 

możesz komentować każdą jedną lub usunąć. Musimy zdefiniować tylko jeden raz.

Powiązane problemy