Session data not preserved after redirection

大城市里の小女人 提交于 2019-12-01 15:34:02

I found out that it is necessary to apply the web middleware on all routes. Drown has mentioned to do so, but since March 23st 2016, Taylor Otwell changed the default RouteServiceProvider at https://github.com/laravel/laravel/commit/5c30c98db96459b4cc878d085490e4677b0b67ed

By that change the web middleware is applied automatically to all routes. If you now apply it again in your routes.php, you will see that web appears twice on the route list (php artisan route:list). This exactly makes the flash data discard.

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

It turns out that with Laravel 5.2, the routes have to be wrapped in the web middleware for the session to work properly.

This fixed it :

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');
});

With Laravel 5.2.34, all routes are using web middleware by default.

Therefore, change this:

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

    // ...

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

});

To this:

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

    // ...

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

});

And then in your controller you could use:

class FooController extends Controller
{
    ...

    public foo() 
    {
        ...

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

    ...
}

Redirect with flash data is done like this:

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

In early Laravel 5.2 versions, all of your Flash and Session data are stored only if your routes are inside web middleware group.

As of Laravel 5.2.34, all routes are using web middleware by default. If you will put them into middleware web group again, you will apply web middleware on your routes twice - such routes will be unable to preserve Flash or Session data.

The issue i had was Session::save() preventing swal from showing after redirect.

Please check APP/kernel.php

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

is define multiple times

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

You can comment any one or delete it. We need to define one time only.

Check your App\Kernel.php file. There may be multiple lines of \Illuminate\Session\Middleware\StartSession::class, Comment one from $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,
        ],
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!