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 :Établir des outils
Après avoir clarifié vos besoins, trouvez les outils dont vous avez besoin en fonction de chaque besoin.Request::getClientIp()
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', ], ];
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'); } }
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); } }
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é.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!