问题描述
之前用的5.2版本flash是可以正常使用,后来使用的新的laravel代码,把之前的代码复制过来之后,flash()不能用了,但是其他的set,put都可以正常使用。不知道是什么地方出了问题。
Route::group([
'middleware' => 'web',
'namespace' => 'Front'
], function () {
//二手区首页
Route::get('/', 'UsedController@index')
->name('used.index');
//发布订单
Route::get('used/publish', 'UsedController@publish')
->name('used.publish');
Route::post('used/postPublish', 'UsedController@postPublish')
->name('used.post_publish');
});
路由文件中是这样写的。
public function postPublish(Request $request)
{
\Session::flash('end.message', '球队创建成功');
\Session::flash('end.level', 'success');
return redirect()->route('used.index');
}
控制器中的代码如上。
解决方法
laravel 5.2 在某个版本升级中, 修改了 RouteServiceProvider , 更改了一个方法
public function map(Router $router)
{
$this->mapWebRoutes($router);
//
}
protected function mapWebRoutes(Router $router)
{
$router->group([
'namespace' => $this->namespace, 'middleware' => 'web',
], function ($router) {
require app_path('Http/webRoutes.php');
});
}
这是laravel给开发者做的一个示范 , 让我们知道http和api , 以及其它端可以加载不同的route文件来启动 . 这意味着laravel 可以有多个不同的bootstrap , 启动多个不同的kernel . 比如有HttpKernel , 还可以有RPCKernel或其它APIKernel , 每个Kernel 如同现在的Http 文件夹一样 ,拥有独立的路由文件 , 控制器 和中间件 . 这样就可以做到多端访问的资源隔离.
然而这个改动在RouteServiceProviders 里就把 'web' 中间件加载了 , 我从前面的版本过来 , 并不知道有这么一出. 中间件 Illuminate\Session\Middleware\StartSession 被启动了两次 .