1.什么是 事件 & 事件源 & 监听器 ?
1.监听器,字面上的理解就是监听观察某个事件(程序)的发生情况,当被监听的使劲按真的发生了的时候,事件发生者(事件源)就会给注册该事件的监听者(监听器)发送消息,告诉监听者某些消息,同时监听者页获得一份事件对象,根据这个对象可以获得相关属性和执行相关操纵。
监听器模型涉及有三个对象
2. 事件:用户对组件的一个操作,或者说程序执行某个方法,称之为一个事件,如机器人程序执行工作。
3. 事件源:发生事件的组件就是事件源,也就是被监听对象,如机器人可以工作,跳舞
4. 事件的监听器处理器:监听并负责处理事件方法,如监听机器人的工作情况,机器人工作前后做出的反应
操作流程
1. 将事件源注册到监听器
2. 组件接受外部作用,也就是事件触发
3. 产生一个事件对象,并将事件对象传递给监听器,由监听处理器进行处理。
4. 监听器执行相关的代码来处理该事件。
2.事件与监听的关系
1.一个监听器 可以对 多个 事件
例如:一个后台登录登出的监听器 分别 对应 登录事件 和 登出事件。
3.laravel 实现流程
例如:实现 用户登录 & 登出系统 分别记录 登录 登出日志
1.app/Providers/EventServiceProvider.php 下 新增 私有的 $subscribe 属性 映射 事件 与 监听器 关系
/**
* 被注册的订阅者类
*
* @var array
*/
protected $subscribe = [
'App\Listeners\AdminEventSubscriber',
];
2.创建 app/Listeners/AdminEventSubscriber.php 并 将下面 代码 copy 到 AdminEventSubscriber.php 文件
namespace App\Listeners;
use App\Events\AdminLoginEvent;//登出事件
use App\Events\AdminLogoutEvent;//登录事件
class AdminEventSubscriber
{
/**
* FunctionName:handleAdminLogin
* Description:处理用户登录事件
* Author:lwl
* @param $event
*/
public function handleAdminLogin($event) {
dd($event);
//写入登录日志
}
/**
* FunctionName:handleAdminLogout
* Description:处理用户注销事件
* Author:码农
* @param $event
*/
public function handleAdminLogout($event) {
dd($event);
//写出登录日志
}
/**
* FunctionName:subscribe
* Description:事件订阅者注册监听器
* Author:码农
* @param $events
*/
public function subscribe($events)
{
//监听 事件 后执行逻辑
$events->listen(AdminLoginEvent::class,[AdminEventSubscriber::class, 'handleAdminLogin']);
$events->listen(AdminLogoutEvent::class,[AdminEventSubscriber::class, 'handleAdminLogout']);
}
}
3.分别创建 登录事件 与 登出事件
app/Events/AdminLoginEvent.php
app/Events/AdminLogoutEvent.php
//1.AdminLoginEvent 代码如下
namespace App\Events;
use App\Models\Admin;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class AdminLoginEvent
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* Create a new event instance.
*
* @return void
*/
protected $admin = null;
public function __construct(Admin $admin)
{
$this->admin = $admin;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
//2.AdminLogoutEvent 代码如下
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class AdminLogoutEvent
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
4.控制器中调用,实现功能
//$adminInstance 后台用户实例
use App\Events\AdminLoginEvent;
use App\Events\AdminLogoutEvent;
event(new AdminLoginEvent($adminInstance));//登录成功后调用
event(new AdminLogoutEvent($adminInstance));//登出成功后调用
5.登录成后 handleAdminLogin 打印