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()->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 中间件也无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.2 或 5.3:如何正确实施检查会话是不是已登录
在 laravel 5.2 中使用默认身份验证路由对用户进行身份验证后设置会话数据