在 Laravel 中发生 Logout 事件时发布时间戳数据

Posted

技术标签:

【中文标题】在 Laravel 中发生 Logout 事件时发布时间戳数据【英文标题】:Post a timestamp data when Logout event occurred in Laravel 【发布时间】:2018-03-25 06:52:35 【问题描述】:

当登录事件发生时,下面的代码是Login Event Listener

我还制作了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();
        
    

【问题讨论】:

您好,您的登录历史表中的注销数据是什么? @Maraboc, Hi ;) 在这种情况下,只想将注销时间戳数据发布到存储的登录数据的同一行。 @Magnetic 使用注销时间戳更新现有记录,而不是插入。您可以根据 user_id 或 user_name 更新记录 【参考方案1】:

在这种情况下,很容易找到带有用户 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 在用户表中是唯一的

【讨论】:

太棒了!!有用!!你总是救我的命:) 乐于助人 ;) 我有一点错误,注销时,最近行数据是最新的,而另一个在行之前生成的数据没有存储 last_logged_at 数据,三个及更多是相同的操作。 :( 好吧,我明白了,这是因为您在应用程序中为每次登录插入一个新行?我认为您可以更新last_login_at 以获取用户的相同记录(如果存在),您的逻辑可以吗? 你不需要更多的赞美:)【参考方案2】:

您可以使用soft delete 添加deleted_at 列。

那么你可以这样查询

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

这将在deleted_at 列中添加时间戳。

【讨论】:

@Pyramid,谢谢你的回答,但它也删除了已经存储的登录行。:( 你需要先使用 softdelete 看文档如何使用 softdeletes 然后试试我的代码它不会删除任何行 @Pyramid,谢谢。它还包括 softDeletes(),您的代码运行良好。顺便说一句,上 Maraboc 的代码正在将数据发布到存储的登录数据行。并且您的代码需要 2 个表(LogoutHistory 和 LoginHistory)作为我的第一个想法。祝你有美好的一天:)

以上是关于在 Laravel 中发生 Logout 事件时发布时间戳数据的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript&jQuery.DOM事件

Laravel 5.2:Auth::logout() 不起作用

使用 Laravel 在 FullCalendar 中重复发生的事件

Laravel Auth::logout() 失败

使用 Vue Router 时 Laravel 路由不起作用

laravel5.2之logout注销账号无效