ThinkPHP8事件两种使用方式

目录

通过监听方式

通过事件订阅

智能订阅

手动订阅


 

  • 监听方式

  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');

     

      从解藕角度来看,监听方式更值得推荐。

 

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值