Laravel 5.2 即使使用 Web 中间件,Session Flash 也无法正常工作

Laravel 5.2 Session flash not working even with web middleware

我正在尝试使用会话实现 flash 消息传递,但我做不到。

在我的控制器中我有:

public function store(Request $request) {
    session()->flash('donald', 'duck');
    session()->put('mickey', 'mouse');
    return redirect()->action('CustomerController@index')->with('bugs', 'bunny');
}

但是当我检查视图中的会话变量时,我只能看到来自 session()->put('mickey', 'mouse') 的值。

会话:

{"_token":"F6DoffOFb17B36eEJQruxvPe0ra1CbyJiaooDn3F","_previous":{"url":"http:\/\/localhost\/customers\/create"},"flash":{"old":[],"new":[]},"mickey":"mouse"}

很多人遇到这个问题是因为web中间件里面没有相关的路由。我也确保这样做了,但还是不行。

在routes.php中:

Route::group(['middleware' => ['web']], function () {

    Route::get('/', function () {
        return view('welcome');
    });

    Route::get('/customers', 'CustomerController@index');
    Route::get('/customers/create', 'CustomerController@create');
    Route::post('/customers', 'CustomerController@store');
});

在Kernel.php中:

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

    'api' => [
        'throttle:60,1',
    ],
];

任何人都可以让我知道我在这里做错了什么吗?谢谢!

使用此代码构建您的 Session Flash 信息:

<?php

Session::flash("Donald", "Duck")
// Or in your code style.
$request->session()->flash("Donald", "Duck")
?>

在您的视图中检查它:

@if(Session::has("Donald")
    {{Session::get("Donald")}}
@endif

您忘记使用 $request :)

在控制器中:

use Session,Redirect;

public function store(Request $request) 
{
Session::flash('donald', 'duck');
Session::put('mickey', 'mouse');
return Redirect::to('/customers')->with('bugs', 'bunny');
}

在'view'检查数据是否正在获取:

<?php
print_r($bugs);die;
?>

祝你好运:)

我用的是:

在我的控制器中:

public function xyz(){
   // code

   // This
   return redirect()->action('homeController@index')->with('success', 'Check! Everything done!');

    // Or this
    return redirect('/index')->with('success', 'Check! Everything done!');
}

在我看来:

@if(session('success'))
    {{ session('success') }}
@endif

没有别的。网络中间件被分配到每个路由。

通过替换

解决了问题
Route::group(['middleware' => ['web']], function () {
   ...
});

Route::group(['middlewareGroups' => ['web']], function () {
   ...
});

虽然所有文档都建议我们使用 ['middleware' => ['web']]

,但不知道为什么会这样

这很可能是因为对 Laravel 框架 (v5.2.27) 进行了更改,默认情况下所有路由都是 "web" 中间件的一部分,因此再次分配它在您的 routes.php 文件中最终分配了两次。

解决方案是从您的路由中删除 "web" 中间件,或者从 RouteServiceProvider 中删除自动分配。

Laravel 更新前:

// RouteServiceProvider.php
$router->group(['namespace' => $this->namespace], function ($router) {
    require app_path('Http/routes.php');
});

Laravel更新后:

// RouteServiceProvider.php
$router->group([
    'namespace' => $this->namespace, 'middleware' => 'web',
], function ($router) {
    require app_path('Http/routes.php');
});

注意新更新如何自动将 "web" 中间件应用于所有路由。如果您希望像以前一样继续使用 Laravel 5.2(在 routes.php 中手动分配 "web" 中间件),只需在此处将其删除。

我不知道为什么,但是在 Windows 你需要改变你的路线:中间件到中间件组,就像这样:

因此,在您的 app\Kernel.php 中,您需要首先将 StartSession 放在中间件组 web 数组中: