在thinkphp6中事件是如何运用的

发布于 2019-12-04 01:49:31

上一篇,说明了什么是事件,现在我们来讲下在thinkphp6中事件是如何运用的.

我们知道事件是使用观察者模式处理业务逻辑的,这其中被观察者就是事件主体,比如应用初始化AppInt,用户登录UserLogin,路由加载完成RouteLoaded等等观察者就是监听这些主体的对象,比如登录后记录日志记录session发送短信等等.

事件的执行流程就是先完成事件的监听(告知对某个事件要进行哪些处理操作),然后是在适当的位置触发事件(轮询所有改事件下的监听器并执行对应操作).

要使用事件,就要先分析出什么是观察者和被观察者,或者说是事件监听者和事件主体.

我们先以thinkphp6内置事件HttpRun为例说明,它表示应用开始事件.我们假设一个使用场景,在应用开始时判断如果是微信访问就跳转.首先我们要创建一个浏览器监听器,

//目录app/listener/Browser
class Browser {
    public function handle($event) {
        if($event->ismobile()){
            return redirect('微信专用地址');
        }
    }
}

有了监听器,然后就是将它绑定到事件上,tp6中通过app/event.php配置文件来显示绑定事件

return [
    'listen'=>[
        'HttpRun'=>['app\listener\Browser'],
        .....
    ]
]

这样HttpRun事件一旦触发,监听器Browser就会执行handle方法下的代码.

//HttpRun事件是在runWithRequest方法中触发的
$this->app->event->trigger('HttpRun::class');

上面我们说的是系统内置的事件,如果是自定义的事件呢,比如场景用户登录后赠送积分.首先要定义事件主体UserLogin

// app\event\Userlogin
class UserLogin {
    public $user;
    public function __construct(User $user) {
        $this->user = $user;
    }
}

我们可以把这个事件起个标识名,方便调用.

return [
    'bind'=>[
        'UserLogin'=>'app\event\UserLogin',
    ],
    'listen'=>[
        'HttpRun'=>['app\listener\Browser'],
        .....
    ]
]
\\或者动态绑定标识
Event::bind(['UserLogin'=>'app\event\UserLogin']);

有了事件了,下来我们添加监听类

// app\listener\UserLogin.php
class UserLogin {
    public function handle(User $user){
        $user->score++;
        $user->save();
    }
}

事件绑定

return [
    'bind'=>[
        'UserLogin'=>'app\event\UserLogin',
    ],
    'listen'=>[
        'UserLogin'=>['app\listener\UserLogin'],
        .....
    ]
]

最后事件触发

// app/controller/user.php
$user = new User();
if($user->login($username,$password)){
    Event::trigger('UserLogin',$user);
    //或者使用标识
    event('UserLogin',$user);
    //或者使用事件类
    event('app\event\UserLogin',$user);
    //或者
    event(new UserLogin($user));
}

至此,thinkphp6自定义事件流程就介绍完了.

来个更高级的,如果一个观察者对象同时要监听多个事件怎么做,比如用户同时要监听登录事件/登出事件.这时就用到了事件订阅类.

// app\subscribe\User 创建订阅类,同时监听多个事件
class User {
    public function onUserLogin(){
        echo '我登录了';
    }
    public function onUserLogout(){
        echo '我退出了';
    }
}
// app\controller\User.php 订阅类启动监听
class User {
    public function __construct(){
        Event::subscribe(\app\subscribe\User::class); //绑定监听
    }
    
    public function login(){
        event('UserLogin'); //触发
    }
    
    public function logout(){
        event('UserLogout'); //触发
    }
}
参考文章

Bug天天改,头发日日疏,码字不易,如果有帮助到你,就点击"下方感谢"支持一下把.

©声明:本站所有文章,如无特殊说明或标注,均为izhnagbo.cn原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。本文链接 https://izhangbo.cn/article/13.html
0 条评论

学习
记录

发布
问题