2015-12-23 80 views
9

我試圖實現一些自定義Flash消息,並遇到會話數據在重定向後被銷燬的一些問題。重定向後會話數據未保留

這裏是我如何創建我的提示信息:

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

這裏的flash()函數的聲明:

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

這裏是如何我檢查會話/顯示Flash的消息,使用SweetAlerts。此代碼包含在我所有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 

的代碼,如果我稱之爲flash()功能顯示視圖之前,像這樣上面將工作:

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

但是,它不會,如果我把它做一個重定向到另一個頁面之前工作,如下所示:

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

爲什麼會話數據在重定向時丟失?我如何讓它持續存在以便我可以顯示我的Flash消息?

+0

您可以在重定向之前和之後檢查網址嗎?有時候你使用'www.'來登錄域名,並且重定向到沒有'www.'的域名,在這種情況下,你將不會看到會話 –

回答

3

事實證明,與Laravel 5.2,路線都被包裹在Web中間件的會話才能正常工作。

這個固定:

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

我有同樣的問題,但是這種解決方案對我來說不起作用。 – raphael

+0

爲5.2,不會自動應用到所有路由? .. – CodeGuru

+1

@FlyingAtom是的,它被改變了,但在我問這個問題時你必須手動完成。 ;) – Drown

8

我發現有必要適用於所有航線網絡中間件。 Drown已經提到要這樣做,但自2016年3月23日起,Taylor Otwell將默認的RouteServiceProvider更改爲https://github.com/laravel/laravel/commit/5c30c98db96459b4cc878d085490e4677b0b67ed

通過該更改,web中間件自動應用於所有路由。如果您現在再次在您的routes.php中應用它,您將看到web在路由列表中出現兩次(php artisan route:list)。這正是閃存數據丟棄。

另見:https://laracasts.com/discuss/channels/laravel/session-flash-message-not-working-after-redirect-route/replies/159117

+0

謝謝,那曾經是我的問題.. –

+0

驚人的趕上,謝謝 – manix

1

重定向與閃存數據做是這樣的:

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

早期Laravel 5.2版本,所有的FlashSession數據只存儲,如果你的路由是在web middleware組內。

截至Laravel 5.2.34,全部路由默認使用的是web中間件。如果您再次將它們放入中間件Web組,您將在路線上應用網絡中間件兩次 - 這些路線將無法保留FlashSession數據。

2

使用Laravel 5.2.34,默認情況下所有路由都使用Web中間件。

因此,改變這種:

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

    // ... 

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

}); 

要這樣:

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

    // ... 

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

}); 

然後在你的控制器,你可以使用:

class FooController extends Controller 
{ 
    ... 

    public foo() 
    { 
     ... 

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

    ... 
} 
1

我有問題是Session::save()防止SwaI位從重定向後顯示。

0

請檢查APP/kernel.php

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

被定義多次

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

您可以發表評論的任何一個或刪除。我們只需要定義一次。