Post Laravel 发生注销事件时的时间戳数据
Post a timestamp data when Logout event occurred in Laravel
以下代码是Login Event Listener
登录事件发生时的代码。
我也做了 Logout Event Listener
和 Login one 一样的设计。
它有效,但它只是在相同的 table.
中生成了另一行
那我怎样才能使 Logout
数据与登录数据 post 在 table 中编辑的同一行?
是否可以post一个数据到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 在用户 table
中是唯一的
您可以使用 soft delete 添加 deleted_at
列。
那么你可以这样查询
$log = LogoutHistory::where('user_name', $event->user->name)->delete();
这将在 deleted_at
列中添加时间戳。
以下代码是Login Event Listener
登录事件发生时的代码。
我也做了 Logout Event Listener
和 Login one 一样的设计。
它有效,但它只是在相同的 table.
中生成了另一行那我怎样才能使 Logout
数据与登录数据 post 在 table 中编辑的同一行?
是否可以post一个数据到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 在用户 table
中是唯一的您可以使用 soft delete 添加 deleted_at
列。
那么你可以这样查询
$log = LogoutHistory::where('user_name', $event->user->name)->delete();
这将在 deleted_at
列中添加时间戳。