Yii 2.0 中事件的使用
关于PHP的事件处理,参照
http://www.cnblogs.com/mafeifan/p/4322238.html
http://www.cnblogs.com/mafeifan/p/4322271.html
为什么要使用事件?可能我们会有下面的业务需求,每当一个新用户注册成功会我们要给管理员发封邮件,还要有推送通知。
之前的代码可能是这样
if($model->save()){
// 注册成功, 跳转
}
要变成这样
if($model->save()){
$mailObj->sendNewUserMail($model);
$notification->setNotification($model);
}
目前看起来也没这么不好的,但是随着业务的发展,如果当用户注册后要去处理10件事情,我们一直要往save()下面塞逻辑?
事件就是对应这种类似场景的。
在Yii2.0中使用事件其实非常简单。下面是一个例子。
1. 定义事件名
在common\models\User模型文件中,定义一个事件名。
对你看到了,Yii2.0中事件名用常量定义,好处是由于PHP变量区别大小写。这样写既保证唯一又不容易出错。
const EVENT_NEW_USER = 'new-user';
2. 定义事件要去处理的事情,就是各种方法啦。
public function sendMail($event){
echo 'mail sent to admin';
// you code
}
public function notification($event){
echo 'notification created';
}
直接写在User模型好像不太好,应该有专门的发送邮件及通知的模块。这里不是重点。
3. 接着在User文件中。将执行的逻辑放到一个统一的方法中。
public function init(){
$this->on(self::EVENT_NEW_USER, [$this, 'sendMail');
$this->on(self::EVENT_NEW_USER, [$this, 'notification');
}
4. 最后在Controller中。调用事件就OK了。
if($model->save()){
$model->trigger(User::EVENT_NEW_USER);
}
Yii2.0中绑定事件用on()方法,解除用off()方法,调用事件用trigger()方法。
/**
* 测试事件1
* 使用匿名函数
*/
public function actionTestEvent1(){
$user = new User();
// 使用匿名函数
$user->on(User::EVENT_NEW_USER,function(){
echo 'run~';
});
$user->trigger(User::EVENT_NEW_USER);
$user->off(User::EVENT_NEW_USER);
$user->trigger(User::EVENT_NEW_USER);
die();
}
这是用一个匿名函数来绑定到EVENT_NEW_USER事件中。
3. 在User模型中添加一个方法。
绑定方法到事件上,
$user->on(User::EVENT_NEW_USER,[$user,'sendMail']);
注意这句的意思是将$user对象中的sendMail方法绑定到User::EVENT_NEW_USER事件上。
/**
* 测试事件2
* 使用类中的方法
*/
public function actionTestEvent2(){
$user = new User();
// 使用匿名函数
$user->on(User::EVENT_NEW_USER,[$user,'sendMail']);
$user->trigger(User::EVENT_NEW_USER);
$user->off(User::EVENT_NEW_USER);
die();
}
类似的,直接使用类里面的方法
/**
* 测试事件3
* 使用类中的方法
*/
public function actionTestEvent3(){
// \common\components\EventTest::Bar();
$user = new User();
// 使用匿名函数
$user->on(User::EVENT_NEW_USER,['common\components\EventTest','Bar']);
$user->trigger(User::EVENT_NEW_USER);
die();
}
需要创建EventTest类文件
namespace common\components;
use Yii;
use yii\base\Component;
use yii\base\Event; class EventTest extends Component
{
const EVENT_HELLO = 'hello'; public function Bar(){
echo 'run method';
}
}
总结一下。
附件事件处理有四种方法:
$foo = new Foo; // 处理器是全局函数
$foo->on(Foo::EVENT_HELLO, 'function_name'); // 处理器是对象方法
$foo->on(Foo::EVENT_HELLO, [$object, 'methodName']); // 处理器是静态类方法
$foo->on(Foo::EVENT_HELLO, ['app\components\Bar', 'methodName']); // 处理器是匿名函数
$foo->on(Foo::EVENT_HELLO, function ($event) {
//事件处理逻辑
});
关于事件的执行顺序及级别,可以查看文档:http://www.yiichina.com/doc/guide/2.0/concept-events
Yii 2.0 中事件的使用的更多相关文章
- as3.0中如何阻止事件冒泡
原作者:菩提树下的杨过转载出处:http://yjmyzz.cnblogs.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究 ...
- yii 2.0 代码阅读 小记
1.\yii\base\object 设置了get/set属性...使用getName()获取属性名..构造函数中使用config初始化属性 2.\yii\base\Component 继承自Obje ...
- [译] C# 5.0 中的 Async 和 Await (整理中...)
C# 5.0 中的 Async 和 Await [博主]反骨仔 [本文]http://www.cnblogs.com/liqingwen/p/6069062.html 伴随着 .NET 4.5 和 V ...
- [Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]
Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同.这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间.本文旨在抛砖引玉,如 ...
- FineUI(开源版)v6.0中FState服务器端验证的实现原理
前言 1. FineUI(开源版)是完整开源,最早发起于 2008-04,下载全部源代码:http://fineui.codeplex.com/ 2. 你可以通过捐赠作者来支持FineUI(开源版)的 ...
- AppBox v6.0中实现子页面和父页面的复杂交互
前言 1. AppBox是捐赠开源(获取源代码至少需要捐赠作者 1 元钱),基于的 FineUI(开源版)则是完整开源,网址:http://fineui.codeplex.com/ 2. 你可以通过捐 ...
- Hadoop2.6.0的事件分类与实现
前言 说实在的,在阅读Hadoop YARN的源码之前,我对于java枚举的使用相形见绌.YARN中实现的事件在可读性.可维护性.可扩展性方面的工作都值得借鉴. 概念 在具体分析源码之前,我们先看看Y ...
- 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用
http://blog.csdn.net/5iasp/article/details/37054171 文章标题:关于JAVA中事件分发和监听机制实现的代码实例 文章地址: http://blog.c ...
- 有关OpenCV1.0中GUI命令的几个函数学习总结
1.修改窗口背景色或者光标形状 在OpenCV1.0版本利用函数int cvNamedWindow( const char* name, int flags )初始化创建一个窗口后,窗口的背景色是灰色 ...
随机推荐
- Scrum培训小体会
公司组织Scrum培训. 虽然是针对ScrumMaster这个角色的培训,但更多是基于对Scrum这个敏捷开发实践方法的了解. 回来也有一些感想,记录下来.以后在工作实践中,继续探索.实践.体验.感悟 ...
- selenium + python自动化测试unittest框架学习(四)python导入模块及包知识点
在写脚本的时候,发现导入某些模块,经常报错提示导入模块失败,这里来恶补下python导入模块的知识点. 1.模块导入时文件查找顺序 在脚本中,import xxx模块时的具体步骤: (1)新建一个mo ...
- 关于日期的一些常用方法的封装——dates.js
针对自己在日常用到的一些日期方法,整理成一个js日期插件,插件定义了一个dates全局对象,继承了Date函数,相当于在Date函数上做了一些扩展. 这个插件会不断更新,所有我之后用到的关于日期的自定 ...
- 利用maven开发springMVC项目——开发环境搭建(版本错误解决)
申明:部分内容参见别人的博客,没有任何的商业用途,只是作为自己学习使用.(大佬博客) 一.相关环境 - eclipse :eclipse-jee-oxygen-3-win32-x86_64(下载地址) ...
- page_address()函数分析--如何通过page取得虚拟地址
由于X86平台上面,内存是划分为低端内存和高端内存的,所以在两个区域内的page查找对应的虚拟地址是不一样的. 一. x86上关于page_address()函数的定义 在include/linux/ ...
- 使用java代码将时间戳和时间互相转换
时间戳转时间: SimpleDateFormat simpleDateFormat = null; simpleDateFormat = new SimpleDateFormat("yyyy ...
- 利用PDCA工具改进周例会
PDCA简介 PDCA循环又叫戴明环,是美国质量管理专家休哈特博士首先提出的,由戴明采纳.宣传,获得普及,从而也被称为“戴明环”. PDCA最早用来解决全面质量管理问题,但是PDCA也可以用来作为一个 ...
- vue中的slot(插槽)
vue中的插槽----slot 什么是插槽? 插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性. ...
- 读取本地json文件另一种方式
function getScenemapData(){ $.ajax({ url: "/js/currency.json", type: "GET" ...
- C++的六个函数
一.构造函数 在C++中,构造函数是六个函数中的第一个,当一个对象被创建时,在它的整个周期中,是一个由生到死的 过程,即构造函数创建对象,析构函数析构对象.在对象被创建时,调用构造函数创建一个对象,这 ...