事件机制的实现有两种途径:通过监听、通过订阅
一、通过监听
1、创建监听类:在命令行模式下进入框架根目录执行
php think make:listener
例如:
php think make:listener UserListener
执行之后将在\app\listener\下生成UserListener这个类。
立即学习“PHP免费学习笔记(深入)”;
2、配置监听:在\app\event.php这个文件的listen数组中配置UserListener这个类,如下:
'listen' => [
'testEvent' => ['app\listener\UserListener']
],
3、触发监听:在你需要触发监听的地方加入如下代码
event('testEvent');注意:这里的参数testEvent即为事件名称,可随便定义,但必须要与在event.php文件里配置的键名一致。
触发监听时你可以带上第二个参数。通过第二个参数你可以把任何数据传递到UserListener这个类中,也就是handle方法的参数(不明白啥意思的结合下面的完整代码理解)。
4、处理监听逻辑:在UserListener类的handle方法中完成业务逻辑
完整代码如下
Other:一个用来测试的类
Index:触发监听的类
UserListener:事件监听类
name; //当调用Index类的test4方法时该代码有效,$event为Other类的实例 //可以调用Other类的hello方法 echo $event->hello(); } }二、通过订阅
1、创建订阅类
在命令行模式下进入框架根目录执行
php think make:subscribe
例如:
php think make:subscribe UserSubscribe
执行之后将在\app\subscribe\下生成UserSubscribe这个类。
2、配置监听
在\app\event.php这个文件的subscribe数组中配置UserSubscribe这个类,如下:
云模块网站管理系统3.1.03下载云模块_YunMOK网站管理系统采用PHP+MYSQL为编程语言,搭载自主研发的模块化引擎驱动技术,实现可视化拖拽无技术创建并管理网站!如你所想,无限可能,支持创建任何网站:企业、商城、O2O、门户、论坛、人才等一块儿搞定!永久免费授权,包括商业用途; 默认内置三套免费模板。PC网站+手机网站+适配微信+文章管理+产品管理+SEO优化+组件扩展+NEW Login界面.....目测已经遥遥领先..
'subscribe' => ['app\subscribe\UserSubscribe'],
注意:为了测试效果,要把上面配置的UserListener从listen数组删除掉
3、触发监听
跟第一种途径一样
4、处理监听逻辑
处理监听的逻辑又有两种方法,我称之为自动绑定和手动绑定。手动绑定和自动绑定是互斥的,只能二选一。
4.1 自动绑定
完成业务逻辑的ontestEvent方法应该被添加到UserSubscribe类中。添加的方法名不能随意定义,规则是事件名称前面加上on。因为我们在event.php里定义的事件名称是testEvent,所以方法名就是ontestEvent(注意大小写)。监听方法定义之后就自动与事件绑定,所以我称之为自动绑定。
完整代码如下
Other和Index类的代码跟第一种途径一样
UserSubscribe:事件订阅类
name; //当调用Index类的test4方法时该代码有效,$event为Other类的实例 //可以调用Other类的hello方法 echo $user->hello(); } }4.2 手动绑定
首先,创建事件类,负责处理具体的业务逻辑。在命令行模式下进入框架根目录执行:
php think make:event
例如:
php think make:event UserEvent
执行之后将在\app\event\下生成UserEvent这个类。
再在该类中定义一个handle方法,该方法有一个传入参数。方法名和传入的参数名可以任意定义。具体的业务逻辑就可以放在handle方法里面处理。
接下来,在UserSubscribe类里面新增subscribe方法,该方法需要接收一个Event对象作为参数。接着,在该函数里将事件监听绑定到UserEvent类的handle方法上。如下:
$event->listen('testEvent', [app('app\event\UserEvent'), 'handle']);完整代码如下
Other和Index类的代码跟第一种途径一样
UserSubscribe:事件订阅类
listen('testEvent', [app('app\event\UserEvent'), 'handle']); } }UserEvent:事件处理类
name; //当调用Index类的test4方法时该代码有效,$user为Other类的实例 //可以调用Other类的hello方法 echo $user->hello(); } }











