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
将该代码复制过去放到项目或相应的中间件组中即可
(3),如果你从route服务里面创建的路由文件
可以直接通过在编写相关方法,在跳转前直接加入web中间件组
protected function mapXXRoutes()
{
Route::middleware('web')
->namespace($this->xxx)
->group(base_path('routes/xxx.php'));
}
2,session使用失效(中间件,controller方法里)
原因主要有以下几点:
(1)session没有开启,解决办法同方法如1
(2)larvel为了防止不断的加载更新session相关信息到文件或数据库中,当运行put方法后并没有立马将内容存储到文件或者数据库中,而是存储在缓存,当全部页面或者方法加载完成后,再将缓存文件中的session保存到相关的文件或数据库中。 如果页面没有加载完或者错误使用dd(),die(),exit()等方法直接终止操作的化,会造成session没有保存到文件或数据库中,下次使用将无法获取里面的数据。
解决办法:1,将dd(),die(),exit()等终止操作更换为return,表示页面或者方法已经加载完成
2,使用Session::put之后使用Session::save()强制保存
(3) 路由分组不合理,为了让同一个项目可以给不同模块使用,而相互直接不影响,laravel将不同分组的下的session的token 默认变为的不同,导致你加载其他模块地址的时候session_id不统一,从而获取不到值
解决办法: 1,将相关路由建立到同一个分组下面
Route::get('/', function () {
//路由放在这里})->middleware('web');
或者
Route::group(['middleware' => ['web']], function () {
//路由放在这里});
2,使用共享机制让所有相关域名下的所有项目共享同一个session
此操作必须使用共同数据库或者redis,更改.env文件即可
SESSION_DOMAIN=.xxx.com //这里自定义自己的域名 注意前面有个.
将两个项目中APP_KEY 的值改一致