关于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 中事件的使用的更多相关文章

  1. as3.0中如何阻止事件冒泡

    原作者:菩提树下的杨过转载出处:http://yjmyzz.cnblogs.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究 ...

  2. yii 2.0 代码阅读 小记

    1.\yii\base\object 设置了get/set属性...使用getName()获取属性名..构造函数中使用config初始化属性 2.\yii\base\Component 继承自Obje ...

  3. [译] C# 5.0 中的 Async 和 Await (整理中...)

    C# 5.0 中的 Async 和 Await [博主]反骨仔 [本文]http://www.cnblogs.com/liqingwen/p/6069062.html 伴随着 .NET 4.5 和 V ...

  4. [Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]

    Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同.这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间.本文旨在抛砖引玉,如 ...

  5. FineUI(开源版)v6.0中FState服务器端验证的实现原理

    前言 1. FineUI(开源版)是完整开源,最早发起于 2008-04,下载全部源代码:http://fineui.codeplex.com/ 2. 你可以通过捐赠作者来支持FineUI(开源版)的 ...

  6. AppBox v6.0中实现子页面和父页面的复杂交互

    前言 1. AppBox是捐赠开源(获取源代码至少需要捐赠作者 1 元钱),基于的 FineUI(开源版)则是完整开源,网址:http://fineui.codeplex.com/ 2. 你可以通过捐 ...

  7. Hadoop2.6.0的事件分类与实现

    前言 说实在的,在阅读Hadoop YARN的源码之前,我对于java枚举的使用相形见绌.YARN中实现的事件在可读性.可维护性.可扩展性方面的工作都值得借鉴. 概念 在具体分析源码之前,我们先看看Y ...

  8. 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用

    http://blog.csdn.net/5iasp/article/details/37054171 文章标题:关于JAVA中事件分发和监听机制实现的代码实例 文章地址: http://blog.c ...

  9. 有关OpenCV1.0中GUI命令的几个函数学习总结

    1.修改窗口背景色或者光标形状 在OpenCV1.0版本利用函数int cvNamedWindow( const char* name, int flags )初始化创建一个窗口后,窗口的背景色是灰色 ...

随机推荐

  1. python各种模块的使用

    Pexpect模块:http://www.ibm.com/developerworks/cn/linux/l-cn-pexpect1/ ConfigParser模块:http://blog.china ...

  2. 【[JXOI2017]加法】

    江西竟然还有省选,而且还是可怜题,实在是有点可怕 这道题还是比较清真的,大概是最简单的可怜题? 首先看到最大值最小,就很容易想到了二分答案 对于一个二分出来的答案\(mid\),去把原数列扫一遍就可以 ...

  3. vue2.* 环境搭建01

    搭建vue的开发环境: https://cn.vuejs.org/v2/guide/installation.html 1.必须要安装nodejs 2.搭建vue的开发环境 ,安装vue的脚手架工具 ...

  4. 【jQuery】结合accordion插件分析写插件的方法及注意事项

    1.jQuery插件的命名方式:jquery.[插件名].js 2.对象方法附加在jQuery.fn上,全局函数附加在jQuery对象本身上 3.插件内部this指向的是通过选择器获取的jQuery对 ...

  5. 【小游戏】flappy pig

    (1)这款游戏的画面很简单:一张背景图,始终就没有变过: (2)这款游戏的对象只有俩:一个小鸟(有三种挥动翅膀的状态)以及一对管道(有管道向上和向下两个方向): http://www.cnblogs. ...

  6. Kali-linux使用社会工程学工具包(SET)

    社会工程学工具包(SET)是一个开源的.Python驱动的社会工程学渗透测试工具.这套工具包由David Kenned设计,而且已经成为业界部署实施社会工程学攻击的标准.SET利用人们的好奇心.信任. ...

  7. Microsoft visual c++ 14.0 is required问题

    错误信息: error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Too ...

  8. I、Q信号是如何产生的,I、Q信号复用的作用

    接收机在中频部分实现模数变换和采样,采样后的信号和数字域的同频相乘,就可以得到基带的I.Q分量.在无线接口传输时,每一种使用特定的载波频率.码(扩频码和扰码)以及载波相对相位(I或Q)的信道都可以理解 ...

  9. ASP.NET Core MVC中的IActionFilter.OnActionExecuted方法执行时,Controller中Action返回的对象是否已经输出到Http Response中

    我们在ASP.NET Core MVC项目中有如下HomeController: using Microsoft.AspNetCore.Mvc; namespace AspNetCoreActionF ...

  10. MySQL索引优化经验总结

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引 ...