利用Laravel事件系统如何实现登录日志的记录详解
发布时间 - 2026-01-11 01:11:55 点击率:次本文介绍的是利用Laravel事件系统实现登录日志记录的相关内容,分享出来给大家参考,下面来看看详细的介绍:

明确需求
记录一个登录日志,通常需要下列信息:
- 客户端Agent信息
- 客户端IP地址
- 访问IP地点
- 登录时间
- 登录用户信息
确立工具
明确完需求后,根据每个需求查找自己所需的工具吧。
- 需求1 jenssegers/agent就可以满足我们要求
- 需求2 Laravel下直接
Request::getClientIp() - 需求3 zhuzhichao/ip-location-zh这个包可以满足要求
- 需求4 time()
- 需求5 登录用户模型
开工
采用Laravel的事件订阅系统来实现,需要实现一个登录事件和一个登录事件监听器。
生成事件和监听器
Laravel命令行支持自动生成事件和监听器,在App\Providers\EventServiceProvider中添加需要实现的事件:
protected $listen = [ ..., //添加登录事件及对应监听器,一个事件可绑定多个监听器 'App\Events\LoginEvent' => [ 'App\Listeners\LoginListener', ], ];
运行命令:php artisan event:generate就会自动生成事件和监听器,已存在的事件和监听器不会发生改变。
登录事件(Event)
回顾下需求,我们的登录事件需要的5点信息,在事件中需要记录这些信息,所以事件设计如下:
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use App\Models\User;
use Jenssegers\Agent\Agent;
class LoginEvent
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* @var User 用户模型
*/
protected $user;
/**
* @var Agent Agent对象
*/
protected $agent;
/**
* @var string IP地址
*/
protected $ip;
/**
* @var int 登录时间戳
*/
protected $timestamp;
/**
* 实例化事件时传递这些信息
*/
public function __construct($user, $agent, $ip, $timestamp)
{
$this->user = $user;
$this->agent = $agent;
$this->ip = $ip;
$this->timestamp = $timestamp;
}
public function getUser()
{
return $this->user;
}
public function getAgent()
{
return $this->agent;
}
public function getIp()
{
return $this->ip;
}
public function getTimestamp()
{
return $this->timestamp;
}
/**
* Get the channels the event should broadcast on.
*
* @return Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-default');
}
}
在事件中记录所需要的信息,并实现这些信息的get方法。
登录监听器(Listener)
在监听器中,获取到事件传递过来的信息,把这些信息记录到数据库中,实现如下:
namespace App\Listeners;
use App\Events\LoginEvent;
class LoginListener
{
// handle方法中处理事件
public function handle(LoginEvent $event)
{
//获取事件中保存的信息
$user = $event->getUser();
$agent = $event->getAgent();
$ip = $event->getIp();
$timestamp = $event->getTimestamp();
//登录信息
$login_info = [
'ip' => $ip,
'login_time' => $timestamp,
'user_id' => $user->id
];
// zhuzhichao/ip-location-zh 包含的方法获取ip地理位置
$addresses = \Ip::find($ip);
$login_info['address'] = implode(' ', $addresses);
// jenssegers/agent 的方法来提取agent信息
$login_info['device'] = $agent->device(); //设备名称
$browser = $agent->browser();
$login_info['browser'] = $browser . ' ' . $agent->version($browser); //浏览器
$platform = $agent->platform();
$login_info['platform'] = $platform . ' ' . $agent->version($platform); //操作系统
$login_info['language'] = implode(',', $agent->languages()); //语言
//设备类型
if ($agent->isTablet()) {
// 平板
$login_info['device_type'] = 'tablet';
} else if ($agent->isMobile()) {
// 便捷设备
$login_info['device_type'] = 'mobile';
} else if ($agent->isRobot()) {
// 爬虫机器人
$login_info['device_type'] = 'robot';
$login_info['device'] = $agent->robot(); //机器人名称
} else {
// 桌面设备
$login_info['device_type'] = 'desktop';
}
//插入到数据库
DB::table('login_log')->insert($login_info);
}
}
这样,监听器就完成了,每次一触发登录事件,就会在数据库中添加一条登录信息。
触发事件
通过全局的event()方法来触发事件,event()方法的参数为事件实例:
namespace App\Controllers;
...
use App\Events\LoginEvent;
use Jenssegers\Agent\Agent;
class AuthControoler extends Controller
{
...
public function login(Request $request)
{
//登录实现
...
//登录成功,触发事件
event(new LoginEvent($this->guard()->user(), new Agent(), \Request::getClientIp(), time()));
...
}
}
队列化监听器
有时监听器会进行一些耗时操作,这时应该结合Laravel的队列系统将监听器进行队列化,前提是已经配置了队列并开启了队列处理器。
队列化非常简单,只需监听器实现ShouldQueue接口即可,即:
namespace App\Listeners;
...
use Illuminate\Contracts\Queue\ShouldQueue;
class LoginListener implements ShouldQueue
{
/**
* 失败重试次数
* @var int
*/
public $tries = 1;
...
}
总结
Laravel的事件系统实现起来还是非常优雅的,同一个事件可以很方便的添加各类监听器,且各个监听器之间互不干扰,解耦性非常强。加上队列系统,可以很方便的处理一些后续任务。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# laravel
# 日志记录
# laravel5.3登录日志
# 事件
# Laravel实现用户注册和登录
# Laravel搭建后台登录系统步骤详解
# Laravel 自带的Auth验证登录方法
# Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
# Laravel重写用户登录简单示例
# SSO单点登录的PHP实现方法(Laravel框架)
# Laravel5.2使用Captcha生成验证码实现登录(session巨坑)
# php的laravel框架快速集成微信登录的方法
# laravel5.2实现区分前后台用户登录的方法
# Laravel登录失败次数限制的实现方法
# 方法来
# 很方便
# 数据库中
# 自动生成
# 事件中
# 的是
# 客户端
# 系统实现
# 就会
# 好了
# 相关内容
# 多个
# 只需
# 会在
# 所需
# 给大家
# 来看看
# 就可
# 这篇文章
# 谢谢大家
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
高防服务器租用如何选择配置与防御等级?
Laravel如何使用.env文件管理环境变量?(最佳实践)
如何用VPS主机快速搭建个人网站?
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
零服务器AI建站解决方案:快速部署与云端平台低成本实践
如何快速选择适合个人网站的云服务器配置?
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Laravel如何实现数据库事务?(DB Facade示例)
Bootstrap整体框架之JavaScript插件架构
做企业网站制作流程,企业网站制作基本流程有哪些?
javascript基于原型链的继承及call和apply函数用法分析
Laravel如何为API编写文档_Laravel API文档生成与维护方法
Android Socket接口实现即时通讯实例代码
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
Laravel如何与Inertia.js和Vue/React构建现代单页应用
JavaScript模板引擎Template.js使用详解
晋江文学城电脑版官网 晋江文学城网页版直接进入
bing浏览器学术搜索入口_bing学术文献检索地址
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
网站建设整体流程解析,建站其实很容易!
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
大型企业网站制作流程,做网站需要注册公司吗?
图册素材网站设计制作软件,图册的导出方式有几种?
JavaScript数据类型有哪些_如何准确判断一个变量的类型
如何获取PHP WAP自助建站系统源码?
如何破解联通资金短缺导致的基站建设难题?
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
独立制作一个网站多少钱,建立网站需要花多少钱?
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
如何在七牛云存储上搭建网站并设置自定义域名?
微信小程序 scroll-view组件实现列表页实例代码
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
微信小程序 HTTPS报错整理常见问题及解决方案
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
BootStrap整体框架之基础布局组件
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
Laravel怎么调用外部API_Laravel Http Client客户端使用
公司网站制作价格怎么算,公司办个官网需要多少钱?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复

