当前位置:首页 > CMS教程 > 其它CMS > 列表

laravel获取不到session的三种解决办法【推荐】

发布:smiling 来源: PHP粉丝网  添加日期:2021-10-29 10:53:46 浏览: 评论:0 

这篇文章主要介绍了laravel获取不到session的三种解决办法的相关资料,需要的朋友可以参考下。

问题:引用第三方类库时,使用全局函数session()可以保存session,但是获取不到

1、路由置于 web 中间件下,修改app/Http/Kernel.php文件,如下

  1. protected $middlewareGroups = [ 
  2.   //中间件web 
  3.   'web' => [ 
  4.    \App\Http\Middleware\EncryptCookies::class, 
  5.    \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
  6.    //看到这里了吗!StartSession!!!!要把路由放在这个中间件了才会启动Session!! 
  7.    \Illuminate\Session\Middleware\StartSession::class, 
  8.    \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
  9.    \App\Http\Middleware\VerifyCsrfToken::class, 
  10.   ], 
  11.    
  12.   'api' => [ 
  13.    'throttle:60,1', 
  14.   ], 
  15.  ]; 

2、修改路由写法,如下

  1. //两种路由中间件写法各人喜好! 
  2. Route::get('/'function () { 
  3.  //路由放在这里 
  4. })->middleware('web'); 
  5.    
  6. Route::group(['middleware' => ['web']], function () { 
  7.  //路由放在这里 
  8. }); 
  9. //routes.php 

3、Laravel不用php原生的session,那么在controller之后应该做了一些事情,将session写入到文件中,而不是每次put操作都写操作,这样会IO操作太频繁的,影响性能的。

查看调用相关的代码。laravel编译后,在bootstrap/compiled.php中

  1. class Middleware implements HttpKernelInterface 
  2.  ... 
  3.  public function handle(Request $request$type = HttpKernelInterface::MASTER_REQUEST, $catch = true) 
  4.  { 
  5.   $this->checkRequestForArraySessions($request); 
  6.   if ($this->sessionConfigured()) { 
  7.    $session = $this->startSession($request); // 启动session 
  8.    $request->setSession($session); 
  9.   } 
  10.   $response = $this->app->handle($request$type$catch); // 调用controller的method 
  11.   if ($this->sessionConfigured()) { 
  12.    $this->closeSession($session);   //关闭session 
  13.    $this->addCookieToResponse($response$session); 
  14.   } 
  15.   return $response
  16.  } 
  17.  ... 
  18.    
  19.  protected function closeSession(SessionInterface $session
  20.  { 
  21.   $session->save(); // 保存session 
  22.   $this->collectGarbage($session); 
  23.  } 

可以看见,在调用完controller之后,调用了session->save()的方法,来主动的保存session。这样session才能落地保存起来,如果在controller或者view里面写了exit;,那么session是不会被保存的,除非主动的写Session::save()才能手工的保存起来。或者把die();exit();换成return!

Tags: laravel获取session

分享到: