15

我正在尝试实现一些自定义闪存消息,并且在重定向后会话数据被破坏时遇到了一些问题。

以下是我创建我的 Flash 消息的方法:

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

这是flash()函数的声明:

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

这是我使用 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 消息?

4

9 回答 9

12

我发现有必要在所有路由上应用 web 中间件。Drown 曾提到这样做,但自 2016 年 3 月 23 日起,Taylor Otwell 在https://github.com/laravel/laravel/commit/5c30c98db96459b4cc878d085490e4677b0b67ed更改了默认 RouteServiceProvider

通过该更改,Web 中间件将自动应用于所有路由。如果您现在在您的 routes.php 中再次应用它,您将看到它在路由列表 ( )中web出现两次。php artisan route:list这正是使闪存数据被丢弃。

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

于 2016-05-01T16:06:15.717 回答
6

事实证明,在 Laravel 5.2 中,必须将路由包装在 Web 中间件中才能使会话正常工作。

这修复了它:

Route::group(['middleware' => ['web']], function () {
    // ...
    Route::post('/topics/{slug}/answer', 'PostsController@answer');
    Route::post('/topics/{slug}/unanswer', 'PostsController@unanswer');
    Route::post('/topics/{slug}/delete', 'PostsController@delete');
});
于 2015-12-24T02:00:24.820 回答
5

请检查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,
    ],

您可以评论任何一个或删除它。我们只需要定义一次。

于 2017-08-17T07:02:57.233 回答
4

我遇到的问题是Session::save()阻止 swal 在重定向后显示。

所以你需要从中间件中删除Session::save()session()->save();

于 2017-07-14T05:00:27.377 回答
2

在 Laravel 5.2.34 中,所有路由都默认使用 Web 中间件。

因此,改变这个:

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

    // ...

    Route::post('/foo', 'FooController@foo');

});

对此:

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

    // ...

    Route::post('/foo', 'FooController@foo');

});

然后在您的控制器中,您可以使用:

class FooController extends Controller
{
    ...

    public foo() 
    {
        ...

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

    ...
}
于 2016-06-13T16:02:52.500 回答
1

使用闪存数据重定向是这样完成的:

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

早期的 Laravel 5.2版本中,只有当您的路线在组内时,您的所有数据Flash和数据才会被存储。Sessionweb middleware

Laravel 5.2.34 开始,所有路由都默认使用 web 中间件。如果您将它们再次放入中间件 web 组,您将在您的路由上应用 web 中间件两次 - 这样的路由将无法保存FlashSession数据。

于 2016-05-28T08:37:41.107 回答
0

除了@Harry Bosh的回答,

在 Laravel 中Session::save(),中间件内部发生了一个问题,这会使_flash 会话在重定向发生后消失

这可以通过使用替代解决:

// replace your Session::save() to this

session(['yoursessionvar' => $examplevar]); // this will save laravel session
于 2019-11-26T07:52:08.203 回答
0

检查您的 App\Kernel.php 文件。\Illuminate\Session\Middleware\StartSession::class可能有多行, 注释来自 $middlewareGroups 的一行。

protected $middleware = [
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            **\Illuminate\Session\Middleware\StartSession::class,**
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
于 2019-09-12T08:51:34.850 回答
0

您是否厌倦了使用“重定向方式”

https://laravel.com/docs/5.2/responses#redirecting-with-flashed-session-data

于 2015-12-23T16:33:54.620 回答