重定向后不保留会话数据

Dro*_*own 11 php session redirect laravel laravel-5.2

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

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

flash('Your topic has been created.');
Run Code Online (Sandbox Code Playgroud)

这是flash()函数的声明:

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

以下是我使用SweetAlerts检查会话/显示Flash消息的方法.此代码包含在我在所有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
Run Code Online (Sandbox Code Playgroud)

如果我flash()在显示视图之前调用该函数,上面的代码将起作用,如下所示:

public function show($slug)
{
    flash('It works!');
    return view('welcome');
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我在重定向到另一个页面之前调用它,它将无法工作,如下所示:

public function show($slug)
{
    flash('It does not work');
    return redirect('/');
}
Run Code Online (Sandbox Code Playgroud)

为什么会话数据在重定向时丢失了?如何让它持续存在以便我可以显示我的flash消息?

rap*_*ael 10

我发现有必要在所有路由上应用Web中间件.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


Dro*_*own 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');
});
Run Code Online (Sandbox Code Playgroud)

  • 我有同样的问题,但这个解决方案对我不起作用。 (3认同)

小智 6

请检查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,
    ],
Run Code Online (Sandbox Code Playgroud)

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


Har*_*osh 5

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

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