一、什么是事件机制

解释:发生了一件事情,然后某些东西对这件事作出反应。

例子:假设发生了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框架的事件机制的更多相关文章

  1. Yii框架zii.widgets.grid自定义按钮,ajax触发事件并提示

    相关类手册: http://www.yiichina.com/api/CButtonColumn   buttons 属性 public array $buttons; the configurati ...

  2. YII框架源码分析(百度PHP大牛创作-原版-无广告无水印)

           YII 框架源码分析    百度联盟事业部——黄银锋 目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 ...

  3. 与《YII框架》不得不说的故事—5篇目录

    与<YII框架>不得不说的故事—基础篇 第1章 课程目标 1-1 课程目标 (00:54) 第2章 课前知识准备 2-1 YII的启动和安装 (05:12) 2-2 YII请求处理流程 ( ...

  4. Yii框架 400 错误

    YII  400错误 在YII框架中400错误是csrf校验失败的意思 csrf是什么? CSRF(Cross-site request forgery跨站请求伪造,也被称为"One Cli ...

  5. 使用 OAuth2-Server-php 在 Yii 框架上搭建 OAuth2 Server

    原文转自 http://www.cnblogs.com/ldms/p/4565547.html Yii 有很多 extension 可以使用,在查看了 Yii 官网上提供的与 OAuth 相关的扩展后 ...

  6. 三级联动(在YII框架中)

    //三级联动 //数据库代码过多就不上传了 //视图 <div class="area">    <table class="table"&g ...

  7. Atitit.事件机制 与 消息机制的联系与区别

    Atitit.事件机制 与 消息机制的联系与区别 1. 消息/事件机制是几乎所有开发语言都有的机制,在某些语言称之为消息(Event),有些地方称之为(Message).1 2. 发布/订阅模式1 3 ...

  8. 重温javascript事件机制

    以前用过一段时间的jquery感觉太方便,太强大了,各种动画效果,dom事件.创建节点.遍历.控件及UI库,应有尽有:开发文档也很多,网上讨论的问题更是甚多,种种迹象表明jquery是一个出色的jav ...

  9. 发布订阅 - 基于A2DFramework的事件机制实现

    SUMMARY 能做什么 DEMO 原理图 应用场景 能做什么 A2DFramework的事件机制是基于发布订阅模式改进得来的一套API,中间件部分实现了msmq.redis.Supersocket可 ...

随机推荐

  1. 未能加载文件或程序集system.web.extensions解决方法

    发现未能加载文件或程序集的错误,这是由于我的机器上没有安装Ajax的原因.问题解决后,整理如下:表现:1."System.Web.Extensions, Version=1.0.61025.0, Cu ...

  2. C#只读属性

    using System; using System.Collections.Generic; using System.Text; namespace 面向对象 { class Person { / ...

  3. 面试总结 转发(CSDN 博主)

    1 https://blog.csdn.net/jackfrued/article/details/44921941 2 https://blog.csdn.net/jackfrued/article ...

  4. CentOS - 查看操作系统版本

    cat /etc/redhat-release 参考: https://www.cnblogs.com/baby123/p/6962398.html

  5. 笔谈OpenGL ES(一)

    现在图形类.视频类app越来越多,学习OpenGL ES是很有必要的,作为程序员是有必要做技术积累的.现在做播放器开发的工作,正好也涉及这块,那就好好学一学. CSDN上有套教程不错,OpenGL E ...

  6. scrapy 用pycharm调试

    1. 用pycharm打开scrapy项目,随便右击一个.py文件,选择Debug "***" 2. pycharm 右上角点击刚才debug的文件,选择Edit Configur ...

  7. Struts框架笔记03_OGNL表达式与值栈

    目录 1. OGNL 1.1 OGNL概述 1.1 什么是OGNL 1.1.2 OGNL的优势 1.1.2 OGNL使用的要素 1.2 OGNL的Java环境入门[了解] 1.2.1 访问对象的方法 ...

  8. ubuntu安裝postman遇到問題

    @ubuntupc:~/Postman/app$ sudo ./Postman ./Postman: error while loading shared libraries: libgconf-2. ...

  9. 打造kubernetes 高可用集群(nginx+keepalived)

    一.添加master 部署高可用k8s架构 1.拷贝/opt/kubernetes目录到新的master上(注意如果新机上部署了etcd要排除掉) scp -r /opt/kubernetes/ ro ...

  10. 编写订单支付api中遇到的问题

    首先我是按照已经有的已经有的支付api去编写订单支付api,但是由于两者是有区别的,所以类似去搬用难免会出问题,首先我是套用已经写好的model,然后写相应的serializer,实现序列化之后就开始 ...