目录
-
监听方式
- 生成事件监听类,在项目根目录下执行以下命令:
//生成一个UserLoginSuccess监听类 php think make:listener UserLoginSuccess
执行之后,会在app->listener目录下生成UserLoginSuccess.php,代码如下:
/* *用户登录成功之后 */ class UserLoginSuccess { //必须定义handle方法,支持依赖注入($param是对象类型)。如果handle返回false,则监听中止 public function handle($param) { // 事件监听处理 echo('执行UserLoginSuccess类的handle函数'); } }
- 注册监听类,在app->event.php配置:
return [ 'listen' => [ //给监听类配置一个"UserLoginSuccess"的标识 'UserLoginSuccess' => ['app\listener\UserLoginSuccess'], //一个事件标识可以配置多个监听类 //'事件标识' => ['监听类','监听类'], // 更多事件监听 ], ];
- 调用
//用助手函数调用 event('UserLoginSuccess'); //门面类调用 think\facade\Event::trigger('UserLoginSuccess');
-
事件订阅
可以通过事件订阅机制,在一个监听器中设置和监听多个事件。在订阅类上声明多个函数,每个函数的名称前都加上"on",在调用事件处理时,函数on后面的名字作为事件标识,自动调用相应的事件处理函数。
智能订阅
- 生成订阅类
//此命令会在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'); } }
- 注册订阅者
return [ 'subscribe' => [ 'app\subscribe\UserLoginAfterSubscribe', // 更多事件订阅 ], ];
- 调用
//调用UserSubscribe的事件SendMessage,省略前面的on,如下: event('SendMessage');//自动调用,名字要一致 event('SendEmail');
手动订阅
- 生成事件类
//定义一个自定义Event类,其实不一定是事件类,普通类也行,但是用事件类架构更加清晰 //以下会在目录app\event下生成一个UserLogin事件类 php think make:event UserLogin
编写代码如下:
namespace app\event; class UserLogin { //hand方法名和参数是自定义的 public function sendMessage($param) { //处理代码 echo('sendmessage'); } }
- 生成订阅类,在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']); } }
- 注册订阅
return [ 'subscribe' => [ 'app\subscribe\UserLoginSubscribe', // 更多事件订阅 ], ];
- 调用
//调用,事件标识是$event->listen('UserLogin',[app('app\event\UserLogin'),'sendMessage'])第一个参数 event('UserLogin');
从解藕角度来看,监听方式更值得推荐。