2017-10-13 66 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