Yii2中事件一般用event表示,只有集成了yii\base\component的对象才能集成类或者对象级别的事件处理过程。
事件的理解和使用要点主要有以下几个要点:
1.事件如何触发?
2.事件处理器是什么?
3.事件级别分为哪几个?
4.如何把事件处理器(handle)绑定到事件上?
5.如何解绑handle?
6.事件处理器的执行顺序?
7.事件常见用途
1.事件触发
调用 yii\base\Component::trigger() 方法触发,通常会在类内部某个方法里调用,如下:
namespace app\components;use yii\base\Component;
use yii\base\Event;class Foo extends Component
{const EVENT_HELLO = 'hello';public function bar() { $this->trigger(self::EVENT_HELLO); } }

2.事件处理器 Event Handlers
事件处理器是一个PHP 回调函数,参数是一个event对象。
下面复习一下回调函数的一般写法:
①.匿名函数 function($event){
}
②.某个对象的方法
[$obj,'方法名称']
③.类的静态防范
[static::className(),'静态方法名']
④.全局函数,这种情况比较少一点,
'全局方法名'
3.事件级别
官方文档没有强调这个,可以大致分为3个级别:
①对象级别,对于某个对象的事件触发,参考1中的例子
②类级别事件处理,
如果想对某一类对象不想一个个的附加事件处理,可以在类级别直接绑定,使用方法如下。
调用yii\base\Event的on方法
Event::on(静态类名,静态类事件,事件处理器);
use Yii;
use yii\base\Event;
use yii\db\ActiveRecord;Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function ($event) {Yii::trace(get_class($event->sender) . ' is inserted');
});

③全局事件绑定以及处理
全局应用即Yii::$app,全局应用是个单例对象,可以使用对象的事件绑定方法
第一步,在应用入口脚本:
Yii::$app->on('bar', function ($event) {echo get_class($event->sender); // 显示 "app\components\Foo"
});

第二步:埋点,在需要的地方进行触发
Yii::$app->trigger('bar', new Event(['sender' => new Foo]));

这里的触发器的第二个参数表示可以定义事件对象的一些属性,
name:事件名
sender:调用 trigger() 方法的对象
data:附加事件处理器时传入的数据,默认为空
4.如何把事件处理器(handle)绑定到事件上?
一般而言,调用类或者对象的on方法即可,但是对于类或者对象的on方法的参数会有一些不一样。
5.如何解绑handle?
解绑发方法为off,与4中on的使用类似。
6.事件处理器的执行顺序?
事件处理器将按附加次序依次调用,默认新附加的事件处理器排在已存在处理器队列的最后。
特殊情况如果需要优先调用则可以在on函数中传递第四个参数为false,即可第一个调用。如下所示:
$foo->on(Foo::EVENT_HELLO, function ($event) {
// 这个处理器将被插入到处理器队列的第一位...
}, $data, false);

7.经典用法
事件的用途比较多,常见的用途是记录日志,
如记录全局的代码级别的操作日志,数据库的更新操作日志等等。
①记录全局访问日志的写法:
在配置文件中假如如下配置: 'on beforeRequest' => handle;
②记录数据库更新操作
第一步,在配置文件新增行为配置:'as adminLog' => 'app\\behaviors\\AdminDbLogBehavior';
第二部,在yii\db\command类中埋点,比如在execute中:
const EVENT_EXECUTE = 'execute';
public function execute()
{$this->trigger(self::EVENT_EXECUTE);.....other code
}

第三步,在AdminDbLogBehavior.php中进行事件绑定,并指定事件处理器,在事件处理器中进行具体的记录操作,代码类似如下:
namespace frontend\behaviors;use Yii;
use yii\base\Application;
use yii\base\Behavior;
use yii\base\Event;
use yii\db\Command; class AdminLogBehavior extends Behavior { public function events() { return [ Application::EVENT_BEFORE_REQUEST => 'handle' ]; } public function handle() { Event::on(Command::className(), Command::EVENT_EXECUTE,[$this,'log']); } public function log($event) { //具体的记录操作, //如果是记录db更新操作那么不要直接记录到当前数据库,否则会引起循环记录  } } 

转载于:https://www.cnblogs.com/bestOrnothing/p/yii2_event.html

Yii2 事件学习笔记相关推荐

  1. C#委托与事件学习笔记

    今天跟随视频学习了一下C#中最重要的一些概念之委托与事件.老杨的视频讲的还是挺深入浅出,不过刚接触C#.NET的人还是朦朦胧胧,就像张子阳先生说的"每次见到委托和事件就觉得心里别(biè)得 ...

  2. Yii2 framework学习笔记(五) -- 为后台更换皮肤

    为前台和后台做出区别,为backend换台AdminLTE的皮肤. 网上有现成的yii2的adminLTE插件,直接使用之. 在composer.json里的require节点添加如下内容 " ...

  3. SilverLight学习笔记--如何解决Button不响应MouseLeftButtonDown与MouseLeftButtonUp事件的问题...

    在Silverlight 2 中的按钮不能响应MouseLeftButtonDown 和 MouseLeftButtonUp 事件,为解决此问题,我们可通过创建自定义按钮控件加以解决, 1.创建自定义 ...

  4. freeRtos学习笔记 (5)事件组

    freeRtos学习笔记 freeRtos事件组 为什么要用事件组? 多任务环境下, 任务.中断之间往往需要同步操作,一个事件发生会告知等待中的任 务,即形成一个任务与任务.中断与任务间的同步.事件可 ...

  5. 软件调试学习笔记(三)—— 调试事件的处理

    软件调试学习笔记(三)-- 调试事件的处理 要点回顾 调试事件的处理 实验一:实现简单调试器(创建进程) 实验二:分析异常来源 实验三:实现简单调试器(附加进程) 实验四:分析NtDebugActiv ...

  6. 软件调试学习笔记(二)—— 调试事件的采集

    软件调试学习笔记(二)-- 调试事件的采集 要点回顾 调试事件的种类 调试事件采集函数 例:分析PspUserThreadStartup 例:分析PspExitThread 总结 要点回顾 调试器与被 ...

  7. Windows事件等待学习笔记(四)—— 事件信号量互斥体

    Windows事件等待学习笔记(四)-- 事件&信号量&互斥体 要点回顾 事件 实验:验证SignalState 第一步:编译并运行以下代码 第二步:观察结果 第三步:修改代码并执行 ...

  8. Windows事件等待学习笔记(三)—— WaitForSingleObject函数分析

    Windows事件等待学习笔记(三)-- WaitForSingleObject函数分析 要点回顾 WaitForSingleObject NtWaitForSingleObject KeWaitFo ...

  9. Windows事件等待学习笔记(二)—— 线程等待与唤醒

    Windows事件等待学习笔记(二)-- 线程等待与唤醒 要点回顾 等待与唤醒机制 可等待对象 可等待对象的差异 线程与等待对象 一个线程等待一个对象 实验 第一步:编译并运行以下代码 第二步:在Wi ...

最新文章

  1. html图片加波浪滤镜,CSS滤镜wave属性(波形滤镜)
  2. 计算机课程认识,认识计算机课程教案.doc
  3. 展示动图_DNF:多GIF动图展示,暗夜使者个性武器幻化推荐
  4. VTK:PolyData之KochanekSplineDemo
  5. PHP中间件--ICE
  6. GCD HDU - 1695
  7. lambda的java_一分钟搞明白java8中的lambda
  8. ExtJs十一(ExtJs Mvc图片管理之一)
  9. 前端常用功能记录(一)
  10. WINDOWS 2008Server 配置nginx 反向代理服务器 安装成服务
  11. 一款音频播放软件设计文档,欢迎提出宝贵
  12. 2020-12-28
  13. 基于Echarts实现可视化数据大屏物流云大数据看板页面HTML模板
  14. (三)ArcGIS Server之发布要素服务
  15. 【转载】经典SQL语句大全(绝对的经典)
  16. 膜拜大神,Linux之父家中停电6天,竟然还码出新版Linux内核!
  17. 中国娱记的鼻祖留心shuo新浪博客
  18. 面试时,HR问你职业规划,教你如何回答,得100分!
  19. Linux部署-Net并配置进程守护
  20. Flash与Flex3的配合

热门文章

  1. C#串口通信—传输文件测试
  2. SCCM2012R2七:msi软件分发和卸载
  3. 在linux系统中安装VSCode(Visual Studio Code)
  4. thinkphp集成系列之phpmailer批量发送邮件
  5. 在 OS X 中使用 OpenResty
  6. saltstack的基础入门文档
  7. js weibo api
  8. Struts2对象属性驱动
  9. CCNA-(9)-思科交换机特点
  10. java中System重定向输出流