Maison  >  Article  >  développement back-end  >  Introduction aux méthodes associées d'utilisation du système d'événements Laravel pour terminer la journalisation des connexions

Introduction aux méthodes associées d'utilisation du système d'événements Laravel pour terminer la journalisation des connexions

巴扎黑
巴扎黑original
2017-08-13 14:35:221919parcourir

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. regarde ci-dessous.

Cet article présente le contenu pertinent de l'utilisation du système d'événements Laravel pour implémenter la journalisation des connexions. Il est partagé pour votre référence. Jetons un coup d'œil à l'introduction détaillée :

Exigences claires

L'enregistrement d'un journal de connexion nécessite généralement les informations suivantes :


  • Informations sur l'agent client

  • Adresse IP du client

  • Adresse IP d'accès

  • Heure de connexion

  • Connexion Informations utilisateur

Établir des 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 Laravel

    Request::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 :

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

É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

Le paramètre de la méthode event() est l'instance de l'événement : 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()));
 ... 
 } 
}

Écouteur de file d'attente

Parfois, l'auditeur effectuera des opérations fastidieuses. Dans ce cas, cela devrait être le cas. combiné avec le système de file d'attente de Laravel. L'écouteur est mis en file d'attente, à condition que la file d'attente ait été configurée et que le processeur de file d'attente soit activé.


La 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 les auditeurs n'interfèrent pas les uns avec les autres. est très fort. Couplées au système de file d'attente, certaines tâches de suivi peuvent être facilement traitées.

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