Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erklärung, wie das Laravel-Ereignissystem zur Implementierung des Anmeldeprotokolls verwendet wird

Ausführliche Erklärung, wie das Laravel-Ereignissystem zur Implementierung des Anmeldeprotokolls verwendet wird

*文
*文Original
2018-01-02 17:23:212782Durchsuche

Wie verwende ich das Laravel-Ereignissystem, um das Anmeldeprotokoll zu implementieren? Dieser Artikel führt Sie hauptsächlich in die relevanten Informationen zur Verwendung des Laravel-Ereignissystems zur Implementierung der Anmeldeprotokollierung ein. Die Einführung im Artikel ist sehr detailliert und bietet einen gewissen Referenz- und Lernwert für alle Freunde, die sie benötigen. Ich hoffe, es hilft allen.

Werfen wir einen Blick auf die detaillierte Einführung:

Klare Anforderungen

Um ein Anmeldeprotokoll aufzuzeichnen, sind die folgenden Informationen erforderlich ist normalerweise erforderlich:

  • Client-Agent-Informationen

  • Client-IP-Adresse

  • Zugriff IP-Adresse

  • Anmeldezeit

  • Login-Benutzerinformationen

Einrichten Werkzeuge

Nachdem Sie Ihren Bedarf geklärt haben, finden Sie je nach Bedarf die Werkzeuge, die Sie benötigen.

  • Anforderung 1 Jenssegers/Agent können unsere Anforderungen erfüllen

  • Anforderung 2 Laravel direkt herunterladenRequest::getClientIp()

  • Anforderung 3 zhuzhichao/ip-location-zh Dieses Paket kann die Anforderungen erfüllen

  • Anforderung 4 time()

  • Anforderung 5 Login-Benutzermodell

Bau beginnen

Zur Implementierung muss das Event-Abonnementsystem von Laravel verwendet werden implementiert werden Ein Login-Ereignis und ein Login-Ereignis-Listener.

Ereignisse und Listener generieren

Die Laravel-Befehlszeile unterstützt das automatische Generieren von Ereignissen und Listenern. Fügen Sie die Ereignisse hinzu, die in AppProvidersEventServiceProvider implementiert werden müssen:

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

Führen Sie den Befehl aus: php artisan event:generate und Ereignisse und Listener werden automatisch generiert.

Anmeldeereignis (Ereignis)

Rückblickend auf die Anforderungen erfordert unser Anmeldeereignis 5 Informationspunkte. Diese Informationen müssen im Ereignis aufgezeichnet werden , also das Ereignis Das Design ist wie folgt:

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

Notieren Sie die erforderlichen Informationen im Ereignis und implementieren Sie die Get-Methode dieser Informationen.

Login-Listener (Listener)

Erhalten Sie im Listener die vom Ereignis übergebenen Informationen und zeichnen Sie die Informationen in der Datenbank auf. Die Implementierung ist wie folgt :

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);
    
     } 
}

Auf diese Weise wird der Listener vervollständigt. Jedes Mal, wenn das Anmeldeereignis ausgelöst wird, wird eine Anmeldeinformation zur Datenbank hinzugefügt.

Ereignis auslösen

Lösen Sie das Ereignis über die globale Methode event() aus. Der Parameter der Methode event() ist die Ereignisinstanz:

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

Warteschlangen-Listener

Manchmal führt der Listener einige zeitaufwändige Vorgänge aus. In diesem Fall sollte der Listener in Verbindung mit dem Warteschlangensystem von Laravel in die Warteschlange gestellt werden Die Warteschlange wurde konfiguriert und der Warteschlangenprozessor aktiviert.

Warteschlangenbildung ist sehr einfach, der Listener muss lediglich die ShouldQueue-Schnittstelle implementieren, das heißt:

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

Zusammenfassung

Das Ereignissystem von Laravel ist sehr elegant zu implementieren. Verschiedene Arten von Zuhörern können problemlos zu demselben Ereignis hinzugefügt werden, und jeder Zuhörer stört sich nicht gegenseitig und die Entkopplung ist sehr stark. Gekoppelt mit dem Warteschlangensystem können einige Folgeaufgaben problemlos abgearbeitet werden.

Verwandte Empfehlungen:

Erkunden Sie, wie die Middleware von Laravel implementiert wird

Erklären Sie, wie Sie Verschlüsselungsdienste in Laravel anpassen

Einige praktische Tipps zur Verbesserung der Leistung von Laravel 5

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung, wie das Laravel-Ereignissystem zur Implementierung des Anmeldeprotokolls verwendet wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn