1,有一个坑叫做session没有开启
laravel的session开启是放在web中间件中的,如果你编写路由的时候忽略到掉使用中间web,就会导致项目时候过程中,尝尝发现自己的session没有保存成功,但是,在项目中Session::put后接着Session::get会发现值是有的等各种情况
这时候可以进行两种方式:
(1):加入web中间件,如果写在其他中间件的话,先把web放到前面如
'middleware' => ['web', 'checkWechat'],
(2),将中间件下面的开启放入到自己的项目或中间件中
在app/Http/Kernel.php文件下的$middlewareGroups 下的web数组中有一个
\Illuminate\Session\Middleware\StartSession::class
将该代码复制过去即可
2,中间件使用session发现失效
原因主要有以下几点:
(1)session没有开启,解决办法同方法如1
(2)larvel为了防止不断的加载更新session,larvel并不是所有的put都立马将内容存储到文件或者数据库中
一般采用的机制是全部页面加载完,再将页面的session保存到相关的文件或数据库中
如果页面没有加载完或者其他地方错误使用dd(),die(),exit();都会造成session没有保存到文件或数据库中,下次使用将无法 获取。
解决办法:1,将dd(),die(),exit()等终止操作更换为return,表示页面已经更新完
2,使用Session::put之后使用Session::save()强制保存
(3) 路由分组不合理,为了让同一个项目可以给不同模块使用,而相互直接不影响,laravel将不同分组的下的session的token
默认变为的不同,导致你加载其他路边地址的时候session不统一,从而获取不到值
解决办法: 1,将相关路由建立到同一个分组下面
Route::get('/', function () {
//路由放在这里})->middleware('web');
或者
Route::group(['middleware' => ['web']], function () {
//路由放在这里});
2,使用共享机制让所有相关域名下的所有项目共享同一个session
此操作必须使用共同数据库或者redis,更改.env文件即可
SESSION_DOMAIN=.xxx.com //这里自定义自己的域名 注意前面有个.
将两个项目中APP_KEY 的值改一致