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。
triggeron传入数据方法不同。在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了。

参考

  1. http://www.digpage.com

Yii源码解读 - 事件相关推荐

  1. php service locator,Yii源码解读-服务定位器(ServiceLocator)

    SL的目的也是解耦,并且非常适合基于服务和组件的应用. Service Locator充当了一个运行时的链接器的角色,可以在运行时动态地修改一个类所要选用的服务, 而不必对类作任何的修改. 一个类可以 ...

  2. php yii框架源码,yii 源码解读

    date: 2017-11-21 18:15:18 title: yii 源码解读 本篇博客阅读指南: php & 代码提示: 工欲善其事必先利其器 yii 源码阅读指南: 整体上全貌上进行了 ...

  3. easyswoole2.X源码解读-Dispatcher

    从easyswoole2.X源码解读-事件注册EventRegister我们知道,onRequest事件会通过Dispatcher分发到http的控制器 1. \easyswoole\vendor\e ...

  4. Android6.0源码解读之ViewGroup点击事件分发机制

    本篇博文是Android点击事件分发机制系列博文的第三篇,主要是从解读ViewGroup类的源码入手,根据源码理清ViewGroup点击事件分发原理,明白ViewGroup和View点击事件分发的关系 ...

  5. nodeJS之eventproxy源码解读

    1.源码缩影 !(function (name, definition) { var hasDefine = typeof define === 'function', //检查上下文环境是否为AMD ...

  6. Spring5源码 - 05 invokeBeanFactoryPostProcessors 源码解读_3细说invokeBeanDefinitionRegistryPostProcessors

    文章目录 Pre 细说invokeBeanDefinitionRegistryPostProcessors 流程图 源码分析 解析配置类 parser.parse(candidates) 配置类注册到 ...

  7. IOCP 网络通讯模型源码解读

    From: http://hi.baidu.com/tsingsing/item/1aa5062fa27791fa50fd87b7 以前写服务器的时候用的是iocp,最近偶然发现windows的 网络 ...

  8. AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking...

    我们应该看到过很多类似这样的例子:某个控件拥有加载网络图片的能力.但这究竟是怎么做到的呢?看完这篇文章就明白了. 前言 这篇我们会介绍 AFNetworking 中的3个UIKit中的分类.UIAct ...

  9. Yii源码阅读笔记 - 日志组件

    2015-03-09 一 By youngsterxyf 使用 Yii框架为开发者提供两个静态方法进行日志记录: Yii::log($message, $level, $category); Yii: ...

  10. prism项目搭建 wpf_Prism 源码解读1-Bootstrapper和Region的创建

    介绍 之前也研究过Prism框架但是一直没有深入理解,现在项目上想把一个Winform的桌面应用程序改造成WPF程序,同时我希望程序是可测试可维护架构良好的,Prism的这些设计理念正好符合我的需求, ...

最新文章

  1. python postmessage_解惑:Postmessage函数模拟鼠标单击指定坐标
  2. linux学习之路(一)--centos7安装JDK
  3. tableau必知必会之用 Fixed 函数实现客户回购分析
  4. jmeter的性能监控框架搭建记录(Influxdb+Grafana+Jmeter)
  5. mybatis 无法初始化类_从零开始手写 mybatis(一)MVP 版本
  6. Java FutureTask示例程序
  7. 单尺度二维离散小波重构(逆变换)idwt2
  8. 怎样挑选最健康的酸奶?
  9. python降维——局部线性嵌入算法(LLE)
  10. ionic4 组件的使用(二)
  11. 用大前端技术实现的一款仿Boss直聘app(已开源)
  12. 计算图像的均值、标准差
  13. bzoj3435 [Wc2014]紫荆花之恋
  14. 如何利用计算机模拟分子生物学,利用计算机模拟研究氨基酸序列对于朊病毒分子间聚集的影响...
  15. word中html在哪,如何word中显示部分的域代码在哪
  16. 雷神电脑 ST-plus windows10+ubuntu16.04 双硬盘 双系统超详细安装
  17. Redis 使用 scan 命令代替 keys
  18. 新浪短网址在线生成,官方api接口获取方案
  19. 团队作业1--团队展示
  20. 全球及中国常规救生艇行业研究及十四五规划分析报告

热门文章

  1. 【POJ】【2125】Destroying the Graph
  2. 启动工程Ehcache报错
  3. STM32F4XX高效驱动篇2 I2C
  4. 关于时间、日期的一些应用
  5. Sharepoint 2010 对话框框架
  6. 如何降低软件项目的风险 -- 包括客户的风险,软件提供商的风险
  7. man时括号里的数字是啥意思
  8. Coded UI Test学习网站
  9. 浅谈FMA与SMA(test)
  10. 关于 Java 数组的 12 个最佳方法