重定向后不保留会话数据

时间:2015-12-23 15:27:56

标签: php laravel session redirect laravel-5.2

我尝试实施一些自定义Flash消息,并且在重定向后会议数据被破坏时遇到一些问题。

以下是我创建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检查会话/显示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

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

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

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

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

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

9 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:3)

事实证明,使用Laravel 5.2时,路由必须包含在Web中间件中,以使会话正常工作。

这解决了它:

LINQ to Entities does not recognize the method 'System.Object GetValue(System.Object, System.Object[])' method, and this method cannot be translated into a store expression

答案 2 :(得分: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!!']);
    }

    ...
}

答案 3 :(得分:1)

使用闪存数据重定向如下:

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

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

让你厌倦了使用&#34;重定向&#34;

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

答案 7 :(得分: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,
        ],

答案 8 :(得分:0)

除了 @Harry Bosh 答案之外,

在Laravel中,Session::save()发生在中间件中时, 这样会使 _flash会话在重定向后消失发生

可以使用替代方法解决此问题:

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

session(['yoursessionvar' => $examplevar]); // this will save laravel session