2017-06-22 115 views
1

我正在嘗試創建一箇中間件,用於統計一段時間內用戶訪問我的網站的次數。我試圖在我的中間件中使用laravel會話。這裏是我的代碼:會話在中間件laravel中不工作5.2

class SessionHandler { 
public function handle($request, Closure $next){ 
    if(!Session::has('count')){ 
     Session::set('count', 1); 
     Session::save(); 
    }else{ 
     $numOfVisits = Session::get('count'); 
     $numOfVisits++; 
     Session::set('count', $numOfVisits); 
     Session::save(); 
    } 
    dd(Session::get('count')); 
} 
} 
在我的應用程序

\ HTTP \ kernel.php我加入了中間件SessionStart中間件之後:

protected $middleware = [ 
    .... 
    \Illuminate\Session\Middleware\StartSession::class, 
    \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
    .... 
    \Dideo\Http\Middleware\SessionHandler::class, 
]; 

但我每次刷新頁面,我得到的迴應是1這意味着會話沒有設置。

如何在laravel中間件中使用會話?

[編輯]

我發現,問題是與EncryptCookie中間件。我的會話驅動程序是數據庫,每次刷新頁面時都會在會話表中添加一條記錄。

當我關閉EncryptCookie中間件時,問題得到解決。

+0

它不應該是 - >'如果(會話:: has('count'))'(如果沒有值用'1'實例化? –

+0

修復它但仍然有問題 – Alireza

回答

0

您有錯誤的「如果」條件。您每次都將計數設置爲1。如果它是第一次訪問,那麼設置爲「count + 1」(因此它也是1)。這是你在做什麼!

if (isset($a)) { 
    $a = 1; //set $a to 1 
} else { 
    $a = $a + 1; //set $a to 1 again 
} 
0

似乎是在你的代碼中的小邏輯問題,我會做這樣

public function handle($request, Closure $next){ 
    $value = 1; //Initially it is 1 
    if(Session::has('count')){ //If a previous save has been made take that value 
     $value = Session::get('count') + 1; //add 
    }// do not need an else block, first call will save value of 1 
    Session::set('count', $value); //Set it to 1 (first call) or the incremented value 
    Session::save(); 
    dd(Session::get('count')); 
} 
+1

我修正了我的代碼中的邏輯錯誤 問題出在laravel會話 – Alireza