當laravel獲取不到session的三種解決辦法

佚名發表於2018-12-01

  說到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了應該怎麼辦的具體解決教程了,相信大家如果再遇到這個問題就再也不用心煩了,只要按照示例說的來進行操作那麼就能輕鬆解決了。

相關文章