事件

事件相比较中间件的优势是事件比中间件更加精准定位(或者说粒度更细),并且更适合一些业务场景的扩展。例如,我们通常会遇到用户注册或者登录后需要做一系列操作,通过事件系统可以做到不侵入原有代码完成登录的操作扩展,降低系统的耦合性的同时,也降低了BUG的可能性

定义事件

系统事件存放在listener目录下,创建一个登录后执行的事件,创建文件:app/listener/user/UserLogin.php

<?php

namespace app\listener\user;


class UserLogin
{
        public function __construct()
        {

        }

        public function handle()
        {
            //这里写事件执行的逻辑
        }
}

配置事件

在根目录app/event.php文件的listen数组中配置

<?php


return [
    //事件注入
    'listen' => [
        'user.login'=>[\app\listener\user\UserLogin::class],
    ],
];

调用事件

使用event函数调用事件

event('user.login')

和event使用效果一样

use think\facade\Event;

Event::event('user.login');

触发事件,返回事件的第一个有效返回值,

一个事件后面可以对应多个类来执行,使用当前方法只会返回第一个事件类中的 handle方法中的返回值

use think\facade\Event;

Event::until('user.login');

触发事件,返回所有事件类的返回值

use think\facade\Event;

Event::trigger('user.login');

内置事件

return [
    'bind' => [

    ],

    'listen' => [
        'AppInit' => [],
        'HttpRun' => [],
        'HttpEnd' => [\app\listener\http\HttpEnd::class], //HTTP请求结束回调事件
        'LogLevel' => [],
        'LogWrite' => [],
        'queue.start' => [\app\listener\queue\QueueStart::class],
        'user.login' => [\app\listener\user\Login::class], //
        'admin.info' => [\app\listener\admin\AdminInfo::class],//管理员登录前获取登录信息事件
        'admin.login' => [\app\listener\admin\AdminLogin::class],//管理员登录
        'user.register' => [\app\listener\user\Register::class], //用户注册后置事件
        'wechat.auth' => [\app\listener\wechat\Auth::class], //用户授权后置事件
        'order.orderCreateAfter' => [\app\listener\order\OrderCreateAfter::class], //订单创建后置事件
        'order.orderPaySuccess' => [\app\listener\order\OrderPaySuccess::class], //订单支付成功后置事件
        'order.orderDelivery' => [\app\listener\order\OrderDelivery::class], //订单发货后置事件
        'order.orderTake' => [\app\listener\order\OrderTake::class], //订单收货后置事件
        'order.orderRefundCreateAfter' => [\app\listener\order\OrderRefundCreateAfter::class], //售后单生成后置事件
        'order.orderRefundCancelAfter' => [\app\listener\order\OrderRefundCancelAfter::class], //售后单取消后置事件
        'user.userLevel' => [\app\listener\user\UserLevel::class], //用户升级事件
        'user.userVisit' => [\app\listener\user\UserVisit::class], //用户访问事件
        'notice.notice' => [\app\listener\notice\Notice::class], //通知->消息事件
        'pay.notify' => [\app\listener\pay\Notify::class],//支付异步回调
    ],
    'subscribe' => [
        \app\subscribes\TaskSubscribe::class,//定时任务事件订阅类
    ]
];