php - Laravel 中发生注销事件时发布时间戳数据

标签 php laravel laravel-5 logout

下面的代码是登录事件发生时的登录事件监听器

我还制作了注销事件监听器,与登录事件监听器的设计相同。

它有效,但它只是在同一个表中创建另一行。

那么我怎样才能将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();
        }
    }
}

最佳答案

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

关于php - Laravel 中发生注销事件时发布时间戳数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46724774/

相关文章:

php - 拉维尔 5.4 : Class 'App\Http\Controllers\Response' not found error

PHP file_get_contents() 问题

mysql - Laravel 连接分页

php - 重定向回 l​​aravel 5.3 中请求的页面

php - Laravel 随机连接到不同的数据库

php - 如何从 Laravel 查询中获得相反的结果

php - cURL PHP API 调用不起作用

php - 将 mysql 的结果放在同一行

javascript - 如何将字符串传递给 onclick 消息?

php - Laravel 8 - SQLSTATE[HY000] [2002] 没有那个文件或目录