Yii源码解读 - 事件
Yii基础
事件 event
使用事件,可以在特定的时点,触发执行预先设定的一段代码,事件既是代码解耦的一种方式,也是设计业务流程的一种模式。
事件的相关要素
这是一个什么事件?
谁触发了事件?
谁负责监听这个事件?
事件怎么处理?
事件的相关数据是什么?
事件的引入
事件是从yii\base\Component
类开始出现的。与事件相关的另外一个类是yii\base\Event
,他封装了一些方法,同时提供一些辅助。
事件handler
事件handler
就是事件处理程序,负责事件触发后应该怎么办。handler可以是以下形式:
函数名
对象的方法,或类的静态方法
匿名函数
一个handler必须是以下方式
function ($event){// $event就是yii\base\Event
}
handler的调用是通过call_user_func()
来实现的。
事件的绑定和解除
yii\base\Component::on()
, yii\base\Component::off()
对事件进行绑定和解绑。
person = new Person;// 使用PHP全局函数作为handler来进行绑定
$person->on(Person::EVENT_GREET, 'person_say_hello');// 使用对象$obj的成员函数say_hello来进行绑定
$person->on(Person::EVENT_GREET, [$obj, 'say_hello']);// 使用类Greet的静态成员函数say_hello进行绑定
$person->on(Person::EVENT_GREET, ['app\helper\Greet', 'say_hello']);// 使用匿名函数
$person->on(Person::EVENT_GREET, function ($event) {echo 'Hello';
});
private _events = [];
上面的数组是用来维护事件handler数组
。该数组的下标为事件名,数组元素是形为一系列 [$handler, $data] 的数组
handler
在$event[]
数组中的位置很重要,代表的是执行的先后顺序。执行的先后顺序很重要。
在解除事件时,可以把一个事件下的所有handler
都解除掉。
事件的触发
事件的触发,需要调用yii\base\Component::trigger()
。
yii\base\Application->run()
,很好的举例说明了触发器如何调用。
使用 yii\base\Component::on() 可以为各种事件绑定handler,也可以为同一事件绑定多个handler。
trigger
与on
传入数据方法不同。在on()
中,使用一个简单变量,传入,并在handler中通过$event->data
进行访问。这个是在绑定时确定的数据。而有的数据是没办法在绑定时确定的。
事件的级别
类级别事件
类级别事件用于响应所有类实例的事件。
类级别事件的绑定需要使用yii\base\Event::on()
类级别事件的触发仍然是在yii\base\Component::trigger()
中
类级别事件的触发,应使用yii\base\Event::trigger()
。这个函数不会触发实例级别的事件。
全局事件
利用了Application实例在整个应用的生命周期中全局可访问的特性,来实现这个全局事件的。当然,你也可以将他绑定在任意全局可访问的的Component上。
全局事件一个最大优势在于:在任意需要的时候,都可以触发全局事件,也可以在任意必要的时候绑定,或解除一个事件:
Yii::$app->on('bar', function ($event) {echo get_class($event->sender);
});Yii::$app->trigger('bar', new Event(['sender' => $this]));
上面的Yii::$app->on()
可以在任何地方调用,就可以完成事件的绑定。而 Yii::$app->trigger()
只要在绑定之后的任何时候调用就OK了。
参考
http://www.digpage.com
Yii源码解读 - 事件相关推荐
- php service locator,Yii源码解读-服务定位器(ServiceLocator)
SL的目的也是解耦,并且非常适合基于服务和组件的应用. Service Locator充当了一个运行时的链接器的角色,可以在运行时动态地修改一个类所要选用的服务, 而不必对类作任何的修改. 一个类可以 ...
- php yii框架源码,yii 源码解读
date: 2017-11-21 18:15:18 title: yii 源码解读 本篇博客阅读指南: php & 代码提示: 工欲善其事必先利其器 yii 源码阅读指南: 整体上全貌上进行了 ...
- easyswoole2.X源码解读-Dispatcher
从easyswoole2.X源码解读-事件注册EventRegister我们知道,onRequest事件会通过Dispatcher分发到http的控制器 1. \easyswoole\vendor\e ...
- Android6.0源码解读之ViewGroup点击事件分发机制
本篇博文是Android点击事件分发机制系列博文的第三篇,主要是从解读ViewGroup类的源码入手,根据源码理清ViewGroup点击事件分发原理,明白ViewGroup和View点击事件分发的关系 ...
- nodeJS之eventproxy源码解读
1.源码缩影 !(function (name, definition) { var hasDefine = typeof define === 'function', //检查上下文环境是否为AMD ...
- Spring5源码 - 05 invokeBeanFactoryPostProcessors 源码解读_3细说invokeBeanDefinitionRegistryPostProcessors
文章目录 Pre 细说invokeBeanDefinitionRegistryPostProcessors 流程图 源码分析 解析配置类 parser.parse(candidates) 配置类注册到 ...
- IOCP 网络通讯模型源码解读
From: http://hi.baidu.com/tsingsing/item/1aa5062fa27791fa50fd87b7 以前写服务器的时候用的是iocp,最近偶然发现windows的 网络 ...
- AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking...
我们应该看到过很多类似这样的例子:某个控件拥有加载网络图片的能力.但这究竟是怎么做到的呢?看完这篇文章就明白了. 前言 这篇我们会介绍 AFNetworking 中的3个UIKit中的分类.UIAct ...
- Yii源码阅读笔记 - 日志组件
2015-03-09 一 By youngsterxyf 使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category); Yii: ...
- prism项目搭建 wpf_Prism 源码解读1-Bootstrapper和Region的创建
介绍 之前也研究过Prism框架但是一直没有深入理解,现在项目上想把一个Winform的桌面应用程序改造成WPF程序,同时我希望程序是可测试可维护架构良好的,Prism的这些设计理念正好符合我的需求, ...
最新文章
- python postmessage_解惑:Postmessage函数模拟鼠标单击指定坐标
- linux学习之路(一)--centos7安装JDK
- tableau必知必会之用 Fixed 函数实现客户回购分析
- jmeter的性能监控框架搭建记录(Influxdb+Grafana+Jmeter)
- mybatis 无法初始化类_从零开始手写 mybatis(一)MVP 版本
- Java FutureTask示例程序
- 单尺度二维离散小波重构(逆变换)idwt2
- 怎样挑选最健康的酸奶?
- python降维——局部线性嵌入算法(LLE)
- ionic4 组件的使用(二)
- 用大前端技术实现的一款仿Boss直聘app(已开源)
- 计算图像的均值、标准差
- bzoj3435 [Wc2014]紫荆花之恋
- 如何利用计算机模拟分子生物学,利用计算机模拟研究氨基酸序列对于朊病毒分子间聚集的影响...
- word中html在哪,如何word中显示部分的域代码在哪
- 雷神电脑 ST-plus windows10+ubuntu16.04 双硬盘 双系统超详细安装
- Redis 使用 scan 命令代替 keys
- 新浪短网址在线生成,官方api接口获取方案
- 团队作业1--团队展示
- 全球及中国常规救生艇行业研究及十四五规划分析报告