2017-10-13 52 views
2

發生登錄事件時,以下代碼爲Login Event Listener在Laravel發生註銷事件時發佈時間戳數據

我也做了Logout Event Listener作爲與登錄一樣的設計。

它的工作原理,但它只是在同一個表中的另一行。

那麼我怎樣才能將Logout數據寫入表中登錄數據的同一行呢? 是否可以將數據發佈到登錄數據保存行的deleted_at

謝謝:)

LogSuccessfulLogin.php

<?php 

namespace App\Listeners; 

use Illuminate\Auth\Events\Login; 
use Illuminate\Http\Request; 

use App\LoginHistory; 

class LogSuccessfulLogin 
{ 
    /** 
    * Create the event listener. 
    * 
    * @param Request $request 
    * @return void 
    */ 
    public function __construct(Request $request) 
    { 
     $this->request = $request; 
    } 

    /** 
    * Handle the event. 
    * 
    * @param Login $event 
    * @return void 
    */ 

    public function handle(Login $event) 
    { 

     LoginHistory::create([ 
      'user_name' => $event->user->name, 
      'last_login_at' => date('Y-m-d H:i:s'), 
      'last_login_ip' => $this->request->ip(), 
     ]); 

     $user = $event->user; 
     $user->last_login_at = date('Y-m-d H:i:s'); 
     $user->last_login_ip = $this->request->ip(); 
     $user->save(); 
    } 
} 

LogSuccessfulLogout.php

<?php 

namespace App\Listeners; 

use Illuminate\Auth\Events\Logout; 
use Illuminate\Http\Request; 

use App\LogoutHistory; 
use App\LoginHistory; 
use \Carbon\Carbon; 
use DateTime; 

class LogSuccessfulLogout 
{ 
    /** 
    * Create the event listener. 
    * 
    * @param Request $request 
    * @return void 
    */ 
    public function __construct(Request $request) 
    { 
     $this->request = $request; 
    } 

    /** 
    * Handle the event. 
    * 
    * @param Login $event 
    * @return void 
    */ 
    public function handle(Logout $event) 
    { 
    $log = LoginHistory::where('user_name', $event->user->name)->first(); 

     if($log) 
     { 
      //logout timestamp store. 
      $log->last_logout_at = date('Y-m-d H:i:s'); 
      $log->save(); 

      //calculate time_worked 
      $strStart = Carbon::now(); 
      $strEnd = $log->last_login_at;  
      $dteStart = new DateTime($strStart); 
      $dteEnd = new DateTime($strEnd);  
      $dteDiff = $dteStart->diff($dteEnd); 
      // print $dteDiff->format("%H:%I:%S"); 
      // dd($dteDiff); 
      $log->time_worked = $dteDiff->format("%H:%I:%S"); 
      $log->save(); 
     } 
    } 
} 
+0

嗨,LoginHistory表中您的情況下注銷數據是什麼? – Maraboc

+0

@Maraboc,Hi;)在這種情況下,只想將註銷時間戳數據發佈到存儲的同一行登錄數據。 – Magnetic

+0

@磁性,而不是插入,使用註銷時間戳更新現有的記錄。您可以根據user_id或user_name更新記錄 –

回答

3

在這種情況下,它很簡單找到用戶ID LogoutHistory然後更新它:

public function handle(Logout $event) 
{ 
    $log = LogoutHistory::where('user_name', $event->user->name) 
        ->latest('last_login_at') 
        ->first(); 

    if($log) { 
     $log->last_logout_at = date('Y-m-d H:i:s'); 
     $log->save(); 
    } 
} 

PS:假設user_name是在user表

+1

非常棒!有用!!你總是拯救我的生命:) – Magnetic

+0

高興地幫助;) – Maraboc

+0

我有小錯誤,當註銷時,然後最近行數據是最新的和另一個生成行前沒有存儲last_logged_at數據,三個和更多是相同的行動。 :( – Magnetic

1

可以使用soft delete添加deleted_at列中的唯一。

然後你就可以查詢這樣

$log = LogoutHistory::where('user_name', $event->user->name)->delete(); 

這將在deleted_at列中添加時間戳。

+0

@金字塔,謝謝你的回答,但它已經刪除已存儲的登錄行也。:( – Magnetic

+0

你需要先使用softdelete先看看如何使用softdeletes的文檔,然後試試我的代碼,它不會刪除任何行 –

+1

@Pyramid,Thank y OU。它還包括softDeletes(),你的代碼運行良好。順便說一下,上Maraboc的代碼正在將數據發佈到存儲的登錄數據行。你的代碼需要2個表格(LogoutHistory和LoginHistory)作爲我的第一個想法。祝你有愉快的一天:) – Magnetic