YII框架的事件机制
一、什么是事件机制
解释:发生了一件事情,然后某些东西对这件事作出反应。
例子:假设发生了A同学结婚事件,然后B同学给份子钱反应,那么,B是怎么知道(监听)A事件的发生了呢,有两种办法。
扫描式:B不断的询问A是否要结婚。
绑定式:A要结婚的时候会及时通知B。
二、Yii框架的事件实现方式
Yii采用的是观察者模式来实现事件机制。
事件的监听方式,采用的是,绑定式。
绑定级别有,对象级别绑定,类级别绑定。
下面是代码实例。
1、在 vendor 目录下 新建 classmate 并制作 A同学,B同学类,C同学类。

A同学类。
<?php
namespace vendor\classmate;
use \yii\base\Component;
use \yii\base\Event; class MyEvent extends Event{ //继承事件类
public $message;
} class A_classmate extends Component //继承组件类
{
/**
* A 同学结婚
*/
function marry() {
echo 'A:我要结婚了!<br/>';
$msg = new MyEvent;
$msg->message = '多少随意<br/>';
// 事件结束的时候通知绑定在这个事件上的方法。
$this->trigger('marry',$msg); //第一个参数是事件名称,第二个参数是需要传递给监听方法的参数 它是一个对象
}
}
B同学类。
<?php
namespace vendor\classmate;
class B_classmate
{
/**
* B 同学给份子钱
*/
function member_money($e) {
echo $e->message; //接受到事件结束时候传递的参数
echo 'B:份子钱已备好,拿去不谢!<br/>';
}
}
C同学类。
<?php
namespace vendor\classmate;
class C_classmate
{
/**
* C 同学给份子钱
*/
function member_money($e) {
echo $e->message; //接受到事件结束时候传递的参数
echo 'C:份子钱已备好,拿去不谢!<br/>';
}
}
2、在控制器中调用上面的三个类。
<?php
namespace app\controllers;
use yii\web\Controller;
use \YII;
use vendor\classmate\A_classmate;
use vendor\classmate\B_classmate;
use vendor\classmate\C_classmate;
use \yii\base\Event; class TestController extends Controller
{
public function actionIndex() {
$A_classmate = new A_classmate();
$B_classmate = new B_classmate();
$C_classmate = new C_classmate();
//将事件与对象方法进行绑定 解绑方法是 off
$A_classmate->on('marry',[$B_classmate,'member_money']); //对象级别的事件绑定
Event::on(A_classmate::className(),'marry',[$C_classmate,'member_money']); //类级别的对象绑定
Event::on(A_classmate::className(),'marry',function(){ //类级别绑定匿名函数 注意对象级别也可以绑定匿名函数
echo 'D:呵呵,没空!<br/>';
});
//发生事件
$A_classmate->marry();
}
}
3、表现在浏览器上的效果是。

三、总结
yii通过这种事件机制,实现了在整个请求处理过程中,不改动原有逻辑的情况下,十分方便的添加其它处逻辑。
YII框架的事件机制的更多相关文章
- Yii框架zii.widgets.grid自定义按钮,ajax触发事件并提示
相关类手册: http://www.yiichina.com/api/CButtonColumn buttons 属性 public array $buttons; the configurati ...
- YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)
YII 框架源码分析 百度联盟事业部——黄银锋 目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 ...
- 与《YII框架》不得不说的故事—5篇目录
与<YII框架>不得不说的故事—基础篇 第1章 课程目标 1-1 课程目标 (00:54) 第2章 课前知识准备 2-1 YII的启动和安装 (05:12) 2-2 YII请求处理流程 ( ...
- Yii框架 400 错误
YII 400错误 在YII框架中400错误是csrf校验失败的意思 csrf是什么? CSRF(Cross-site request forgery跨站请求伪造,也被称为"One Cli ...
- 使用 OAuth2-Server-php 在 Yii 框架上搭建 OAuth2 Server
原文转自 http://www.cnblogs.com/ldms/p/4565547.html Yii 有很多 extension 可以使用,在查看了 Yii 官网上提供的与 OAuth 相关的扩展后 ...
- 三级联动(在YII框架中)
//三级联动 //数据库代码过多就不上传了 //视图 <div class="area"> <table class="table"&g ...
- Atitit.事件机制 与 消息机制的联系与区别
Atitit.事件机制 与 消息机制的联系与区别 1. 消息/事件机制是几乎所有开发语言都有的机制,在某些语言称之为消息(Event),有些地方称之为(Message).1 2. 发布/订阅模式1 3 ...
- 重温javascript事件机制
以前用过一段时间的jquery感觉太方便,太强大了,各种动画效果,dom事件.创建节点.遍历.控件及UI库,应有尽有:开发文档也很多,网上讨论的问题更是甚多,种种迹象表明jquery是一个出色的jav ...
- 发布订阅 - 基于A2DFramework的事件机制实现
SUMMARY 能做什么 DEMO 原理图 应用场景 能做什么 A2DFramework的事件机制是基于发布订阅模式改进得来的一套API,中间件部分实现了msmq.redis.Supersocket可 ...
随机推荐
- 【面试突击】- Mybatis-#{}和${}的区别
原文链接:mybatis中#{}和${}的区别 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql时 ...
- Node学习之(第二章:http模块)
前言 继续上一节的探讨,今天我们来聊聊Node中怎么搭建一个简单的web服务器.平时大家在撸码的过程中,经常需要向服务器发送请求,然后服务器接受请求,响应数据.今天我们就来自己手写一个简单服务器,根据 ...
- HTML表格跨行、跨列操作(rowspan、colspan)
转自:https://blog.csdn.net/u012724595/article/details/79401401 一般使用<td>元素的colspan属性来实现单元格跨列操作,使用 ...
- 【亲测可行,图片宽度高度自适应】c# Graphics MeasureString精确测量字体宽度
, , ) { int count = number.Length; //需要配置的字段 //Font f = new Font("Microsoft Sans Serif", f ...
- 微信小程序实现下拉刷新上拉加载
代码片段:https://developers.weixin.qq.com/s/K9VbWZmy7e8C
- python使用tkinter无法获取输入框的值
如果遇到:使用tkinter无法获取输入框Entty()的值的问题,需要检查一下,是否在定义Entry()时立即进行了pack() 会出现使用entryname.get()报错 解决方法:把定义和pa ...
- 使用终端批量下载 B 站视频
需要使用一个叫做 you-get 的命令行程序 可以通过 Homebrew 安装(macOS), 安装命令为 brew install you-get, 其他平台的安装可参考 Github 主页: s ...
- Android笔记(四十八) Android中的资源访问——SDCard
访问存储在SD卡中的文件 使用 Environment.getExternalStorageState(); 判断是否存在内存卡 使用 Environment.getExternalStorageDi ...
- Mybatis,返回Map的时候,将Map内的Key转换为驼峰的命名
每次使用mybatis的时候,简单的连表查询,用Map接收的时候,都是像DB定义的字段一样,类似以下 student_name,student_id,没有转换为驼峰,但是又不能因为这一个定义一个jav ...
- Flask之flask-sqlalchemy
接下来基于这个Flask项目,我们要加入Flask-SQLAlchemy让项目变得生动起来 1.加入Flask-SQLAlchemy第三方组件 from flask import Flask # 导入 ...