首页 > 编程语言 >ThinkPHP8事件两种使用方式

ThinkPHP8事件两种使用方式

时间:2024-08-06 17:54:01浏览次数:9  
标签:ThinkPHP8 两种 订阅 app event UserLoginSuccess 事件 监听

目录

通过监听方式

通过事件订阅

智能订阅

手动订阅


  • 监听方式

  1. 生成事件监听类,在项目根目录下执行以下命令:
    //生成一个UserLoginSuccess监听类
    php think make:listener UserLoginSuccess

    执行之后,会在app->listener目录下生成UserLoginSuccess.php,代码如下:

    /*
    *用户登录成功之后
    */
    class UserLoginSuccess
    {
        //必须定义handle方法,支持依赖注入($param是对象类型)。如果handle返回false,则监听中止
        public function handle($param)
        {
            // 事件监听处理
            echo('执行UserLoginSuccess类的handle函数');
        }   
    }
  2. 注册监听类,在app->event.php配置:
    return [
        'listen'  =>    [
            //给监听类配置一个"UserLoginSuccess"的标识
            'UserLoginSuccess'    =>    ['app\listener\UserLoginSuccess'],
            //一个事件标识可以配置多个监听类
            //'事件标识'    =>    ['监听类','监听类'],
            // 更多事件监听
        ],
    ];
  3. 调用
    //用助手函数调用
    event('UserLoginSuccess');
    //门面类调用
    think\facade\Event::trigger('UserLoginSuccess');
  • 事件订阅

    可以通过事件订阅机制,在一个监听器中设置和监听多个事件。在订阅类上声明多个函数,每个函数的名称前都加上"on",在调用事件处理时,函数on后面的名字作为事件标识,自动调用相应的事件处理函数。

       智能订阅

  1. 生成订阅类
    //此命令会在app\subscribe目录下生成UserLoginAfterSubscribe类
    php think make:subscribe UserLoginAfterSubscribe

    编写代码如下:

    class UserLoginAfterSubscribe
    {
       //命名规范on+事件标识
        public function onSendMessage($user)
        {
            // onSendMessage事件响应处理
            echo('sendMessage');
        }
        //传递的参数不一定是$user,可以自定义,也可以指定类型
        public function onSendEmail($user)
        {
            // onSendEmail事件响应处理
            echo('sendEmail');
        }
    }
  2. 注册订阅者
    return [
        'subscribe'    =>    [
           'app\subscribe\UserLoginAfterSubscribe',
            // 更多事件订阅
        ],
    ];
  3. 调用
    //调用UserSubscribe的事件SendMessage,省略前面的on,如下:
    event('SendMessage');//自动调用,名字要一致
    event('SendEmail');

       手动订阅

  1. 生成事件类
    //定义一个自定义Event类,其实不一定是事件类,普通类也行,但是用事件类架构更加清晰
    //以下会在目录app\event下生成一个UserLogin事件类
    php think make:event UserLogin

    编写代码如下:

    namespace app\event;
    class UserLogin
    {
        //hand方法名和参数是自定义的
        public function sendMessage($param)
        {
            //处理代码
            echo('sendmessage');
        }
    }
  2. 生成订阅类,在subscribe函数里手动注册事件监听
    class UserLoginSubscribe
    {
        //手工事件订阅,方法名必须为subscribe,并在函数里添加事件到事件订阅者
        public function subscribe(Event $event)
        {
            //添加事件到订阅者  第一个参数为事件标识,随便写,第二个参数事件类和执行的函数
            $event->listen('UserLogin',[app('app\event\UserLogin'),'sendMessage']);
    
            //也可以为自动标识函数onLogout动态修改事件标识,原来标识为Logout,现改成Out
            //$event->listen('Out', [$this,'onUserLogout']);
        }
    
    }
  3. 注册订阅
    return [
        'subscribe'    =>    [
           'app\subscribe\UserLoginSubscribe',
            // 更多事件订阅
        ],
    ];
  4. 调用
    //调用,事件标识是$event->listen('UserLogin',[app('app\event\UserLogin'),'sendMessage'])第一个参数
    event('UserLogin');

 

标签:ThinkPHP8,两种,订阅,app,event,UserLoginSuccess,事件,监听
From: https://blog.csdn.net/ivon00001/article/details/140956948

相关文章

  • 记一次 Android 自定义相机拍照奔溃bug事件
    最近在开发一个美颜的相机功能,需要自定义抓取相机回调的数,生成照片并保存到相册,需要自定义保存照片。相机开始使用时没有任何问题,测试拍照几次后突然奔溃,跟踪代码日志发现是图片保存失败,同样的代码,同样的逻辑,正常使用很多次以后才奔溃报错,根据日志找到报错的位置,ContentValue......
  • HTTPS 比 HTTP 更安全吗?这两种协议有什么区别?
    在互联网的通讯过程中,HTTP(超文本传输协议)和HTTPS(安全HTTP)是两种最基本、最重要的通讯协议,它们在网络中都扮演着重要的角色。然而近年来,随着网络安全问题的日益突出,HTTPS的安全性也受到越来越多人的重视。本文将探讨HTTPS是否比HTTP更安全以及两者的区别。首先我们来了解一下......
  • HTTPS 比 HTTP 更安全吗?这两种协议有什么区别?
    在互联网的通讯过程中,HTTP(超文本传输协议)和HTTPS(安全HTTP)是两种最基本、最重要的通讯协议,它们在网络中都扮演着重要的角色。然而近年来,随着网络安全问题的日益突出,HTTPS的安全性也受到越来越多人的重视。本文将探讨HTTPS是否比HTTP更安全以及两者的区别。首先我们来了解一下......
  • HTTPS 比 HTTP 更安全吗?这两种协议有什么区别?
    在互联网的通讯过程中,HTTP(超文本传输协议)和HTTPS(安全HTTP)是两种最基本、最重要的通讯协议,它们在网络中都扮演着重要的角色。然而近年来,随着网络安全问题的日益突出,HTTPS的安全性也受到越来越多人的重视。本文将探讨HTTPS是否比HTTP更安全以及两者的区别。首先我们来了解一下......
  • JavaScript 中的闭包和事件委托
    包(Closures)闭包是JavaScript中一个非常强大的特性,它允许函数访问其外部作用域中的变量,即使在该函数被调用时,外部作用域已经执行完毕。闭包可以帮助我们实现数据的私有化、封装和模块化,使代码更简洁、易读和可维护。闭包的定义简单来说,闭包是指有权访问另一个函数作......
  • SpringBoot-事件监听机制
    SpringBoot-事件监听机制  本文参考的SpringBoot版本是2.6.13  一、SpringBoot启动事件顺序 事件执行顺序: 1. ApplicationStartingEvent   springboot最开始启动时触发,SpringApplication.run()之前发送。 2.ApplicationEnvironm......
  • Oracle捕捉SQL语法错误的10035事件
    Oracle数据库中,有的时候新上的程序,会出现与数据库建立了会话,但是传输的SQL是错误的情况,这个时候,我们需要打开oracle10035事件。ALTERSYSTEMSETEVENTS'10035tracenamecontext forever,level1;打开后,在alert文件中,会出现所有解析失败的SQL.解析失败的原因总结......
  • FPGA设计之跨时钟域(CDC)设计篇(5)----同步FIFO的两种设计方法(计数器法/高位扩展法 | 手撕
    1、什么是FIFO?        FIFO(FirstInFirstOut)是一种先进先出的数据缓存器,在逻辑设计里面用的非常多。它是一种存储器结构,被广泛应用于芯片设计中。FIFO由存储单元队列或阵列构成,第一个被写入队列的数据也是第一个从队列中读出的数据。        FIFO设计可......
  • uniapp中u-input点击事件失效
    uniapp中u-input点击事件失效当给u-input设置了disabled/readonly属性后,pc浏览器中点击事件失效,但是app/移动端h5中却仍有效解决办法给外边包上一个盒子设置点击事件,给input加上css属性:pointer-events:nonepointer-eventsCSS属性指定在什么情况下(如果有)某个特定的图......
  • vue-seamless-scroll插件点击事件不生效
    vue-seamless-scroll点击事件不生效问题:在使用此插件时发现,列表内容前几行还是能正常点击的,但是从第二次出现的列表开始就没有点击事件了原因:因为html元素是复制出来的(滚动组件是将后面的复制出来一份,进行填铺页面,方便滚动)解决:往滚动组件的父节点上添加绑定事件(js冒泡机制),通过......