通过事件(Event)处理,可以在某个特定时刻执行指定的代码,可以解耦代码,同时也增加了可维护性,通常,事件在客户端软件中比较好理解,比如onClick,onFocus,当点击按钮,获取到焦点时执行指定代码。在PHP中,事件的处理可能不太好理解,但是,只要理清了事件处理的过程,一切都会变得简单:

1.注册(或者说绑定)针对某个动作事件的处理器(handler)

2.触发某个动作事件

3.触发1中注册(绑定)的处理器

4.执行处理器中的代码

下面以 猫叫鼠跑 这个例子来简单说明Yii2中的事件处理。

Controller中的代码:

public function actionTest(){
$cat = new Cat('Tom');
$mouse = new Mouse('Jerry'); $data = array('msg'=>'miaow miaow miaow!');
//注册Cat::EVENT_AFTER_SHOUT事件响应(这里对Cat的EVENT_AFTER_SHOUT响应$mouse 的runout方法)
$cat->on(Cat::EVENT_AFTER_SHOUT, [$mouse,'runout'], $data);
//触发shout事件
$cat->shout();
}

Cat类代码:

public function actionTest(){
$cat = new Cat('Tom');
$mouse = new Mouse('Jerry'); $data = array('msg'=>'miaow miaow miaow!');
//注册Cat::EVENT_AFTER_SHOUT事件响应(这里对Cat的EVENT_AFTER_SHOUT响应$mouse 的runout方法)
$cat->on(Cat::EVENT_AFTER_SHOUT, [$mouse,'runout'], $data);
//触发shout事件
$cat->shout();
}

Mouse类代码:

class Mouse extends \yii\base\Component{
private $_name; function __construct($_name) {
$this->_name = $_name;
} public function runout($event){
//事件名称,事件数据,事件发送者
var_dump($event->name,$event->data,$event->sender);
echo 'Cat is shouting,I am a mouse so I need to run!';
}
}

执行actionTest时,会依次输出以下结果

I am a Cat,I am shouting!
Cat is shouting,I am a mouse so I need to run!

在Yii2中,事件分为三个级别:

1.实例事件(同上面的例子,仅对某个实例有效)

2.类事件(对整个类有效)

yii\base\Event::on(
Cat::className(), // 第一个参数表示事件发生的类
Cat::EVENT_AFTER_SHOUT, // 第二个参数表示是什么事件
function ($event) { // 对事件的处理
echo $event->sender;
}
);

3.全局事件(对全局有效)

Yii::$app->on('eventName', function ($event) {
echo get_class($event->sender); // 显示当前触发事件的对象的类名称
});

除了绑定事件外,某些场合也需要移除绑定的事件,常用方法有以下几种:

// 删除所有EVENT_AFTER_SHOUT事件的handler
$cat->off(Cat::EVENT_AFTER_SHOUT); // 删除一个对象的成员函数的handler
$cat->off(Cat::EVENT_AFTER_SHOUT, [$mouse, 'runout']); // 删除一个PHP全局函数的handler
$cat->off(Cat::EVENT_AFTER_SHOUT, 'global_onAfterShout');

来源地址:http://aiddroid.com/yii2-event/

最新文章

  1. 【RabbitMQ】CentOS安装RabbitMQ,及简单的Java客户端连接
  2. 01.总结的javascript-DOM/BOM集合
  3. BootStrap 的modal 中使用typeahead
  4. vb- ----之常用函数
  5. jquery实现自动滚屏效果,适用用公告新闻等滚屏
  6. jbpm node signal
  7. C# 发送邮件3
  8. Arduino命令行编译 树莓派连接Arduino 电脑上编译Arduino代码后 通过树莓派烧写到Arduino上
  9. RTT操作系统
  10. python学习笔记--导入tab键自动补全功能的配置
  11. css.day.05.eg
  12. Android的FrameLayout使用要注意的问题
  13. 微软project文件mpp解析
  14. 一: WCF的服务端与客户端在通信时有三种模式:请求响应模式、数据报模式和双工通讯模式。
  15. ELK安装使用教程
  16. 分部类,分部方法 - 修饰符partial
  17. C++ code:浮点数的比较(Floating-Pointing Number Comparison)
  18. legend2---开发日志3(thinkphp的入口目录是public的体现是什么)
  19. Jenkins使用TFS部署
  20. Java CMYK图片转RGB图片(TwelveMonkeys方式)

热门文章

  1. php 处理 form 表单提交多个 name 属性值相同的 input 标签
  2. 強大的Selector框架
  3. Jmeter3.0-多维度的图形化HTML报告
  4. asp.net core mvc视频A:笔记3-6.视图数据共享之session/cache
  5. python 读写 json文件
  6. 转:使用rsync在linux(服务端)与windows(客户端)之间同步
  7. Cocos2d-x教程(35)-三维拾取Ray-AABB碰撞检測算法
  8. SpringCloud系列五:为Eureka Server添加用户认证及元数据
  9. java数字签名算法之RSA
  10. sparkStreaming的mapWithState函数【案例二】