即使使用Web中间件,Laravel 5.2会话闪存也无法正常工作

时间:2016-03-29 09:06:22

标签: php laravel session laravel-5.2 flash-message

我正在尝试使用会话实现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"}

很多人在网络中间件中没有相关路线时遇到了这个问题。我确保这样做但它仍然无法工作。

在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',
    ],
];

有谁能让我知道我在这里做错了什么?谢谢!

6 个答案:

答案 0 :(得分:29)

通过替换

解决了问题
127.0.0.1

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

当所有文档都显示我们使用Route::group(['middlewareGroups' => ['web']], function () { ... });

时,不知道为什么会这样

答案 1 :(得分:5)

这很可能是因为对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”中间件)。

答案 2 :(得分:2)

使用以下代码构建会话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:)

答案 3 :(得分:1)

在控制器中:

use Session,Redirect;

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

在“查看”中检查数据是否正常:

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

祝你好运:)

答案 4 :(得分:1)

我使用以下内容:

在我的控制器中:

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

没有别的。 Web中间件被分配给每个路由。

答案 5 :(得分:1)

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

change middleware to middlewareGroups

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

put the StartSession at first on array of middleware group web