이 글은 주로 Laravel 이벤트 시스템을 사용하여 로그인 로깅을 구현하는 방법에 대한 관련 정보를 소개합니다. 글의 소개는 매우 자세하며 필요한 모든 사람을 위한 특정 참조 및 학습 가치가 있습니다. .
이 글은 Laravel 이벤트 시스템을 사용하여 로그인 로그 기록을 구현하는 것과 관련된 내용을 소개합니다. 자세한 소개를 살펴보겠습니다.
로그인 기록을 기록하려면. 로그를 저장하려면 일반적으로 다음 정보가 필요합니다.
클라이언트 에이전트 정보
클라이언트 IP 주소
액세스 IP 위치
로그인 시간
로그인 사용자 정보
필요 사항을 명확히 한 후 각 필요에 따라 필요한 도구를 찾으세요.
요구 사항 1 jenssegers/agent는 우리의 요구 사항을 충족할 수 있습니다.
요구 사항 2 Laravel Request::getClientIp()
요구 사항 3 zhuzhichao/ip-location-zh 바로 아래 패키지는 요구 사항을 충족할 수 있습니다Request::getClientIp()
需求3 zhuzhichao/ip-location-zh这个包可以满足要求
需求4 time()
需求5 登录用户模型
开工
采用Laravel的事件订阅系统来实现,需要实现一个登录事件和一个登录事件监听器。
生成事件和监听器
Laravel命令行支持自动生成事件和监听器,在AppProvidersEventServiceProvider中添加需要实现的事件:
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()
요구 사항 4 시간()
요구 사항 5 로그인 사용자 모델
구축 시작
이벤트 및 리스너 생성
Laravel 명령줄은 이벤트 및 리스너 자동 생성을 지원합니다. AppProvidersEventServiceProvider에서 구현해야 하는 이벤트를 추가하세요.
🎜🎜🎜🎜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())); ... } }🎜명령 실행:
php artisan event: generate
이벤트와 리스너는 자동으로 생성되며 기존 이벤트와 리스너는 변경되지 않습니다. 🎜🎜🎜🎜로그인 이벤트(이벤트)🎜🎜🎜요구 사항을 검토하세요. 저희 로그인 이벤트에는 5가지 정보가 필요하므로 이벤트 디자인은 다음과 같습니다. 🎜🎜🎜🎜🎜namespace App\Listeners; ... use Illuminate\Contracts\Queue\ShouldQueue; class LoginListener implements ShouldQueue { /** * 失败重试次数 * @var int */ public $tries = 1; ... }🎜 이벤트에 필요한 정보를 기록하고 이 정보의 가져오기 메소드를 구현하십시오. 🎜🎜🎜🎜Login Listener🎜🎜🎜리스너에서 이벤트가 전달한 정보를 얻어서 데이터베이스에 기록합니다. 구현은 다음과 같습니다. 🎜🎜🎜🎜🎜rrreee🎜이렇게 하면 리스너가 완성됩니다. 로그인 이벤트가 트리거될 때마다 로그인 정보가 데이터베이스에 추가됩니다. 🎜🎜🎜🎜이벤트 트리거🎜🎜🎜전역
event()
메서드를 통해 이벤트를 트리거합니다. event()
메서드의 매개변수는 이벤트 인스턴스입니다. 🎜🎜🎜🎜 🎜rrreee 🎜🎜큐 리스너🎜🎜🎜때때로 리스너는 시간이 많이 걸리는 작업을 수행합니다. 이 경우 큐가 구성되고 큐 프로세서가 활성화된 경우 리스너는 Laravel의 큐 시스템과 함께 큐에 추가되어야 합니다. . 🎜🎜🎜 큐잉은 매우 간단합니다. 리스너는 ShouldQueue 인터페이스를 구현해야 합니다. 즉: 🎜🎜🎜🎜🎜rrreee🎜🎜🎜Summary🎜🎜🎜🎜Laravel의 이벤트 시스템은 구현하기에 매우 우아합니다. 다양한 종류의 모니터를 추가하기 편리하고 각 모니터가 서로 간섭하지 않으며 디커플링이 매우 강력합니다. 대기열 시스템과 결합하면 일부 후속 작업을 쉽게 처리할 수 있습니다. 🎜위 내용은 로그인 로깅을 완료하기 위해 Laravel 이벤트 시스템을 사용하는 관련 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!