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天天改,头发日日疏,码字不易,如果有帮助到你,就点击"下方感谢"支持一下把.