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

Posted

技术标签:

【中文标题】Laravel 5.2 会话闪存即使使用 Web 中间件也无法正常工作【英文标题】:Laravel 5.2 Session flash not working even with web middleware 【发布时间】:2016-07-16 17:55:50 【问题描述】:

我正在尝试使用会话实现 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',
    ],
];

谁能告诉我我在这里做错了什么?谢谢!

【问题讨论】:

请分享您如何检查会话的代码。 为了检查会话,我在视图中添加了<pre> json_encode(session()->all()) </pre> 这不是一个检查会话的系统。 为什么不呢?它让我在结果视图中查看会话数组中的内容 【参考方案1】:

我不知道为什么,但在 Windows 上,您需要更改路由:中间件到中间件组,就像这样:

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

【讨论】:

【参考方案2】:

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

解决方案是从您的路由中删除“网络”中间件或从 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');
);

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

【讨论】:

这是关键!谢谢.. 花了几个小时。【参考方案3】:

通过替换解决了问题

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

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

虽然所有文档都建议我们使用 ['middleware' => ['web']],但不知道为什么会这样

【讨论】:

在你的情况下, ['middleware' => 'web'] 也可以。但是当我们提供中间件数组时,“网络”中间件不起作用。虽然它不在任何文档中。 我很确定我也尝试过 ['middleware' => 'web'] 但它没有用 感谢您节省了我的时间。我遇到了和你一样的问题。看起来应该有文档来说明这一点。 有 ['middleware' => 'web'] 并且无法正常工作,但使用 middlewareGroups 可以按预期工作【参考方案4】:

我使用以下:

在我的控制器中:

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

没有别的了。网络中间件分配给每条路由。

【讨论】:

是的,这段代码应该可以工作,尽管我无法得到它是非常不寻常的。我有另一个具有类似路由和控制器设置的 Laravel 5.2 项目,并且会话工作正常。对于这个项目,我什至尝试进行全新安装,但我仍然遇到同样的问题。【参考方案5】:

在控制器中:

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;
?>

祝你好运:)

【讨论】:

他说他没有得到“虫子”、“兔子”。为此,他应该像这样重定向到正确的路线 return Redirect::to('/customers')->with('bugs', 'bunny');而且你的回答也是正确的。 @Chilion 抱歉测试了多次,还是不行。虽然在会话中出现“唐纳德”键但没有“鸭子”值的地方有些奇怪 @howellmartinez 试试这个:Session::keep(['donald', 'duck']);或 Session::reflash(); session()-&gt;keep(['donald']) 将导致会话具有 "flash":"new":["donald"],"old":[] 但仍然没有 "donald":"duck" 键值对【参考方案6】:

使用此代码构建您的会话闪存信息:

<?php

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

在您的视图中检查它:

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

你忘记使用 $request :)

【讨论】:

感谢您的回复,我之前对此进行了测试,使用 $request 并没有什么不同 :( 据我所知,使用 session() 而不使用 $request 是有效的——那个没有 $request 会调用 session() 助手 (laravel.com/docs/5.2/helpers#method-session)。此外,它没有解释为什么 "bugs":"bunny" 没有出现。

以上是关于Laravel 5.2 会话闪存即使使用 Web 中间件也无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

中间件身份验证不适用于 Web Laravel 5.2

Laravel 5.2 - 会话不会在路由更改中持续存在

Laravel 5.2 或 5.3:如何正确实施检查会话是不是已登录

在 laravel 5.2 中使用默认身份验证路由对用户进行身份验证后设置会话数据

不支持驱动程序 [会话]。在 laravel 5.2 错误?

会话销毁或关闭浏览器选项卡或关闭浏览器后,使用Laravel 5.2执行注销