Detailed explanation of how to use Laravel event system to implement login log

*文
Release: 2023-03-19 06:12:01
Original
2768 people have browsed it

How to use Laravel event system to implement login log? This article mainly introduces you to the relevant information on how to use the Laravel event system to implement login logging. The introduction in the article is very detailed and has certain reference and learning value for everyone. Friends who need it can take a look below. I hope to be helpful.

Let’s take a look at the detailed introduction:

Clear requirements

To record a login log, the following information is usually required:

  • Client Agent information

  • Client IP address

  • Access IP location

  • Login time

  • Login user information

Establishment tool

After clarifying the requirements, find the tools you need based on each requirement.

  • Requirement 1 jenssegers/agent can meet our requirements

  • Requirement 2 Directly under Laravel Request::getClientIp( )

  • Requirement 3 zhuzhichao/ip-location-zhThis package can meet the requirements

  • Requirement 4 time()

  • Requirement 5 Login user model

Start working

Using Laravel To implement an event subscription system, you need to implement a login event and a login event listener.

Generating events and listeners

Laravel command line supports automatically generating events and listeners. Add the events that need to be implemented in App\Providers\EventServiceProvider:

protected $listen = [ 
  ...,
  //添加登录事件及对应监听器,一个事件可绑定多个监听器
  'App\Events\LoginEvent' => [
  'App\Listeners\LoginListener',
 ],
];
Copy after login

Run the command: php artisan event:generateEvents and listeners will be automatically generated, and existing events and listeners will not change.

Login Event (Event)

Looking back at the requirements, our login event requires 5 points of information. This information needs to be recorded in the event, so the event The design is as follows:

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');
     }
}
Copy after login

Record the required information in the event and implement the get method of this information.

Login Listener(Listener)

In the listener, obtain the information passed by the event and record the information into the database. The implementation is as follows :

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);
    
     } 
}
Copy after login

In this way, the listener is completed. Every time a login event is triggered, a piece of login information will be added to the database.

Trigger events

Trigger events through the global event() method, event() method The parameters are event instances:

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()));
 ... 
 } 
}
Copy after login

Queue listener

Sometimes the listener will perform some time-consuming operations. At this time, the listener should be combined with Laravel's queue system. To perform queuing, the premise is that the queue has been configured and the queue processor has been enabled.

Queuing is very simple, just the listener needs to implement the ShouldQueue interface, that is:

namespace App\Listeners; 
...
use Illuminate\Contracts\Queue\ShouldQueue; 
class LoginListener implements ShouldQueue 
{
     /**
     * 失败重试次数
     * @var int
     */
     public $tries = 1;
     ...
}
Copy after login

Summary

Laravel's event system is very elegant to implement. Various types of listeners can be easily added to the same event, and each listener does not interfere with each other, and the decoupling is very strong. Coupled with the queue system, some follow-up tasks can be easily processed.

Related recommendations:

Explore how Laravel’s middleware is implemented

Explain how to customize encryption services in laravel

Some practical tips to improve the performance of Laravel 5

The above is the detailed content of Detailed explanation of how to use Laravel event system to implement login log. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template