laravel 事件 与 监听器

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 打印

你可能感兴趣的:(laravel,php)