Maison  >  Article  >  développement back-end  >  Explication détaillée de la façon d'utiliser le système d'événements Laravel pour implémenter le journal de connexion

Explication détaillée de la façon d'utiliser le système d'événements Laravel pour implémenter le journal de connexion

*文
*文original
2018-01-02 17:23:212683parcourir

Comment utiliser le système d'événements Laravel pour implémenter le journal de connexion ? Cet article vous présente principalement les informations pertinentes sur la façon d'utiliser le système d'événements Laravel pour implémenter la journalisation des connexions. L'introduction dans l'article est très détaillée et a une certaine valeur de référence et d'apprentissage pour tous les amis qui en ont besoin peuvent y jeter un œil ci-dessous. J'espère que cela aide tout le monde.

Jetons un coup d'œil à l'introduction détaillée :

Exigences claires

Pour enregistrer un journal de connexion, les informations suivantes est généralement requis :

  • Informations sur l'agent client

  • Adresse IP du client

  • Accès Adresse IP

  • Heure de connexion

  • Informations utilisateur de connexion

Établir outils

Après avoir clarifié vos besoins, trouvez les outils dont vous avez besoin en fonction de chaque besoin.

  • Exigence 1 jenssegers/agent peut répondre à nos exigences

  • Exigence 2 télécharger directement LaravelRequest::getClientIp()

  • Exigence 3 zhuzhichao/ip-location-zh Ce package peut répondre aux exigences

  • Exigence 4 fois()

  • Exigence 5 Modèle d'utilisateur de connexion

Démarrer la construction

En utilisant le système d'abonnement aux événements de Laravel pour la mise en œuvre, il faut à implémenter Un événement de connexion et un écouteur d'événement de connexion.

Génération d'événements et d'écouteurs

La ligne de commande Laravel prend en charge la génération automatique d'événements et d'écouteurs. Ajoutez les événements qui doivent être implémentés dans AppProvidersEventServiceProvider :

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

Exécutez la commande : php artisan event:generate et les événements et les auditeurs seront automatiquement générés. Les événements et les auditeurs existants ne changeront pas.

Événement de connexion (Événement)

En regardant les exigences, notre événement de connexion nécessite 5 points d'information. Ces informations doivent être enregistrées dans l'événement. , donc l'événement La conception est la suivante :

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

Enregistrez les informations requises dans l'événement et implémentez la méthode get de ces informations.

Connexion à l'écouteur (Listener)

Dans l'écouteur, obtenez les informations transmises par l'événement et enregistrez les informations dans la base de données La mise en œuvre est la suivante. :

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

De cette façon, l'écouteur est terminé. Chaque fois que l'événement de connexion est déclenché, une information de connexion sera ajoutée à la base de données.

Déclencher l'événement

Déclencher l'événement via la méthode globale event() Le paramètre de la méthode event() est l'instance de l'événement :

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

Écouteur de file d'attente

Parfois, l'écouteur effectuera des opérations fastidieuses. Dans ce cas, l'écouteur doit être mis en file d'attente en conjonction avec le système de file d'attente de Laravel, à condition que le système d'écoute soit mis en file d'attente. la file d'attente a été configurée et activez le processeur de file d'attente.

La mise en file d'attente est très simple, il suffit à l'auditeur d'implémenter l'interface ShouldQueue, c'est-à-dire :

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

Résumé

Le système d'événements de Laravel est très élégant à mettre en œuvre. Différents types d'auditeurs peuvent être facilement ajoutés au même événement, et chaque auditeur n'interfère pas les uns avec les autres, et le découplage est très fort. Couplées au système de file d'attente, certaines tâches ultérieures peuvent être facilement traitées.

Recommandations associées :

Découvrez comment le middleware de Laravel est implémenté

Expliquez comment personnaliser les services de chiffrement dans Laravel

Quelques conseils pratiques pour améliorer les performances de Laravel 5

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn