通过事件(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/

Yii2之事件处理的更多相关文章

  1. Yii2的深入学习--事件Event

    我们先来看下事件在 Yii2 中的使用,如下内容摘自 Yii2中文文档 事件可以将自定义代码“注入”到现有代码中的特定执行点.附加自定义代码到某个事件,当这个事件被触发时,这些代码就会自动执行.例如, ...

  2. yii2源码学习笔记(六)

    Behvaior类,Behavior类是所有事件类的基类: 目录yii2\base\Behavior.php <?php /** * @link http://www.yiiframework. ...

  3. Yii2之事件

    众所周知,yii的三大特性是:属性.事件.行为,上一篇博文简单讲解了yii中的属性,本文接着讲讲yii的事件. 事件是代码解耦的一种方式,设计业务流程的一种模式.在yii2.0中,通过Yii\base ...

  4. PHP观察者模式与Yii2.0事件

    1.先看PHP观察者模式的实现: 想要使用事件.必须实现事件的基类.统一的addObserver和trigger方法 定义统一接口.所有的观察者都要实现此接口 //事件的基类 abstract cla ...

  5. Yii2基本概念之——事件(Event)

    说起事件(event),我们可是一点都不陌生.现实生活当中的事件无处不在,比如你发了一条微博,触发了一条事件,导致关注你的人收到了一条消息,看到你发的内容:比如你通过支付宝买东西,付了款,触发一个事件 ...

  6. Yii2事件驱动的运行机制

    最近一段时间正在作个一个项目,这个项目会系统逻辑比较复杂,使用PHP Yii2,使用事件驱动机制进行研发,下面就最近研究事件驱动机制的使用作以下总结: 流程如下: 1.要创建含有事件注入的类,一般这样 ...

  7. yii2深入理解之内核解析

    一.前言 首先,yii2最为为数不多的PHP主流开源框架,受欢迎程度不亚于laravel和TP.个人认为,研究这些框架底层代码是非常有助于自身代码编程思想的提升和代码简化程度和质量的提升的. 那么,话 ...

  8. yii2.0 中的队列

    a yii2 extension to make simple to use queue. yii2-queue让队列的使用在yii2中变得更轻松,她为各种队列组件的使用提供了一个标准的接口,您只需要 ...

  9. EasyUI Tabs + Yii2.0实现iframe方式打开页面(解决共用静态文件引入加载的问题)

    在项目实际开发中,有将打开的各个链接页面隔离的需求(防止静态资源起冲突),这个时候常规思路就是使用iframe来实现!但遇到一个比较棘手的问题,当用easyui Tabs打开一个iframe页面时,怎 ...

随机推荐

  1. 关于\r和\n的一些问题总结

    \r表示"回车"(carriage return).\n表示"换行"(line feed),在Windows系统下.输入回车键会自己主动变成\r\n 相同的,在 ...

  2. js获取url传递参数值

    function request(paras)     {          var url = location.href;          var paraString = url.substr ...

  3. https 加载问题

    https的网站,加载的资源要全部https,如果里面有http的资源,很多浏览器是加载不进来 要地址栏变绿,网站内部全部引用都是https的

  4. Maven常见异常及解决方法(本篇停更至16-4-12)

    本篇文章记录了老猫在学习整合Maven和SSH过程中遇到的问题,有的问题可以解决.有的问题还不能解决. 方法不一定适合全部的环境.但绝对是本人常遇到的常见异常.在这里做一个笔记和记录,也分享给大家,希 ...

  5. jquery的find()

    jQuery 遍历 - find() 方法 jQuery 遍历参考手册 实例 搜索所有段落中的后代 span 元素,并将其颜色设置为红色: $("p").find("sp ...

  6. 安卓手机的后门控制工具SPADE

    SPADE,一款安卓手机的后门控制工具,安全研究人员可以以此了解和研究安卓后门原理. 首先,我们从网站www.apk4fun.com下载apk文件,如ccleaner.然后,我们安装spade git ...

  7. LeetCode78:Subsets

    Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must ...

  8. RecyclerView加载更多用notifyDataSetChanged()刷新图片闪烁

    首先来看看对比ListView看一下RecyclerView的Adapter主要增加了哪些方法: notifyItemChanged(int position) 更新列表position位置上的数据可 ...

  9. Shell Error: -bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory (转)

    错误原因可能有以下几种: 1.在WIN底下用文本编辑工具修改过参数变量,在保存的时候没注意编码格式造成的, 2.也有可能是在VIM里修改,第一行末尾按到ctrl_v 查看文件是DOS格式.UNIX格式 ...

  10. (总结)RHEL/CentOS 7.x的几点新改变

    一.CentOS的Services使用了systemd来代替sysvinit管理 1.systemd的服务管理程序: systemctl是主要的工具,它融合之前service和chkconfig的功能 ...