laravel获取不到session的三种解决办法【推荐】
问题:引用第三方类库时,使用全局函数session()可以保存session,但是获取不到
1、路由置于web中间件下,修改app/Http/Kernel.php文件,如下
protected$middlewareGroups=[ //中间件web 'web'=>[ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, //看到这里了吗!StartSession!!!!要把路由放在这个中间件了才会启动Session!! \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, ], 'api'=>[ 'throttle:60,1', ], ];
2、修改路由写法,如下
//两种路由中间件写法各人喜好! Route::get('/',function(){ //路由放在这里 })->middleware('web'); Route::group(['middleware'=>['web']],function(){ //路由放在这里 }); //routes.php
3、Laravel不用php原生的session,那么在controller之后应该做了一些事情,将session写入到文件中,而不是每次put操作都写操作,这样会IO操作太频繁的,影响性能的。
查看调用相关的代码。laravel编译后,在bootstrap/compiled.php中
classMiddlewareimplementsHttpKernelInterface { ... publicfunctionhandle(Request$request,$type=HttpKernelInterface::MASTER_REQUEST,$catch=true) { $this->checkRequestForArraySessions($request); if($this->sessionConfigured()){ $session=$this->startSession($request);//启动session $request->setSession($session); } $response=$this->app->handle($request,$type,$catch);//调用controller的method if($this->sessionConfigured()){ $this->closeSession($session);//关闭session $this->addCookieToResponse($response,$session); } return$response; } ... protectedfunctioncloseSession(SessionInterface$session) { $session->save();//保存session $this->collectGarbage($session); } }
可以看见,在调用完controller之后,调用了session->save()的方法,来主动的保存session。这样session才能落地保存起来,如果在controller或者view里面写了exit;,那么session是不会被保存的,除非主动的写Session::save()才能手工的保存起来。或者把die();exit();换成return!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。