当laravel获取不到session的三种解决办法

  说到PHP估计有些朋友还有些熟悉,但是对于PHP下的laravel就表示不知道了。有些人因为需要使用到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操作太频繁的,影响性能的。

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

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

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

  以上就是今天给大家分享的关于laravel无法获取session了应该怎么办的具体解决教程了,相信大家如果再遇到这个问题就再也不用心烦了,只要按照示例说的来进行操作那么就能轻松解决了。