Heim  >  Artikel  >  Backend-Entwicklung  >  Einführung in verwandte Methoden zur Verwendung des Laravel-Ereignissystems zur Vervollständigung der Anmeldeprotokollierung

Einführung in verwandte Methoden zur Verwendung des Laravel-Ereignissystems zur Vervollständigung der Anmeldeprotokollierung

巴扎黑
巴扎黑Original
2017-08-13 14:35:221919Durchsuche

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 siehe unten.

Dieser Artikel stellt den relevanten Inhalt der Verwendung des Laravel-Ereignissystems zur Implementierung der Anmeldeprotokollierung vor. Er wird als Referenz weitergegeben:

Klare Anforderungen

Für die Aufzeichnung eines Anmeldeprotokolls sind normalerweise die folgenden Informationen erforderlich:

  • Kundenagenteninformationen

  • Client-IP-Adresse

  • Zugriffs-IP-Adresse

  • Anmeldezeit

  • Anmeldung Benutzerinformationen

Werkzeuge festlegen

Nachdem Sie Ihre Bedürfnisse geklärt haben, finden Sie die Werkzeuge, die Sie je nach Bedarf 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, werden Anmeldeinformationen 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 dies der Fall sein In Kombination mit dem Warteschlangensystem von Laravel wird der Listener in die Warteschlange gestellt, sofern die Warteschlange konfiguriert und der Warteschlangenprozessor aktiviert ist.

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 und die Zuhörer stören sich nicht gegenseitig ist sehr stark. Gekoppelt mit dem Warteschlangensystem können einige Folgeaufgaben problemlos abgearbeitet werden.

Das obige ist der detaillierte Inhalt vonEinführung in verwandte Methoden zur Verwendung des Laravel-Ereignissystems zur Vervollständigung der Anmeldeprotokollierung. 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