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通过这种事件机制,实现了在整个请求处理过程中,不改动原有逻辑的情况下,十分方便的添加其它处逻辑。

时间: 2024-10-12 09:08:35

YII框架的事件机制的相关文章

YII框架分析笔记2:组件和事件行为管理

Yii是一个基于组件.用于开发大型 Web 应用的高性能 PHP 框架.CComponent几乎是所有类的基类,它控制着组件与事件的管理,其方法与属性如下,私有变量$_e数据存放事件(evnet,有些地方叫 hook),$_m数组存放行为(behavior). 组件管理 YII是一个纯oop框架,很多类中的成员变量的受保护或者私有的,CComponent中利用php中的魔术方法__get(),__set()来访问和设置属性,但这些方法的作用远不指这些.下面用__get()来说明 [php] vi

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

                        YII 框架源码分析             百度联盟事业部--黄银锋   目 录 1. 引言 3 1.1.Yii 简介 3 1.2.本文内容与结构 3 2.组件化与模块化 4 2.1.框架加载和运行流程 4 2.2.YiiBase 静态类 5 2.3.组件 6 2.4.模块 9 2.5 .App 应用   10 2.6 .WebApp 应用   11 3.系统组件 13 3.1.日志路由组件  13 3.2.Url 管理组件  15 3.3.异常

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

与<YII框架>不得不说的故事—基础篇 第1章 课程目标 1-1 课程目标 (00:54) 第2章 课前知识准备 2-1 YII的启动和安装 (05:12) 2-2 YII请求处理流程 (02:44) 2-3 命名空间 (10:46) 第3章 控制器 3-1 控制器的创建 (03:22) 3-2 控制器之请求处理 (05:58) 3-3 控制器之响应处理 (09:09) 3-4 控制器之session处理 (09:25) 3-5 控制器之cookie处理 (09:11) 第4章 视图 4-1

Cakephp事件机制尝鲜

cakephp 很老的框架了,尝鲜算是牵强,不过就算很先进的框架例如YII都有这些机制,不过仍然没有理解 手册地址: http://book.cakephp.org/2.0/en/core-libraries/events.html 使用方式: 1.在需要支持事件的类中(包括.模型.控制器等)使用CakeEventListener 接口并且,实现接口规定的所有方法. <?php App::uses( 'AppModel', 'Model' ); App::uses('CakeEventListe

使用Yii框架中遇到的三个问题

以下由我们在信易网络公司开发项目的时候终结出的一些经验 1.main.php文件中欲引入全局变量的问题 还原一下此问题:在Yii框架中,main.php一般会作为整个应用的配置文件,保存Application的各种参数,直接return数组.在使用的过程中,因为main.php文件一定会被Yii提前加载,所以将一些全局性的操作也放在了此文件,加载一些类操作啥的没有什么问题,当有一次加了一个全局变量,并且在其它地方使用global获取全局变量时,发现无论我如何努力都得到的是NULL.各种尝试后,终

Yii框架 400 错误

YII  400错误 在YII框架中400错误是csrf校验失败的意思 csrf是什么? CSRF(Cross-site request forgery跨站请求伪造,也被称为"One Click Attack"或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用. 所以,如果你自己没有csrf校验机制,严禁关闭csrf. 怎么关呢? public $enableCsrfValidation=false;  设置 为false为成员变量 如果不关.怎么

YII框架分析笔记10:日志

yii框架中日志组件记录的等级5类,在CLogger已通过常量定义: const LEVEL_TRACE='trace'; const LEVEL_WARNING='warning'; const LEVEL_ERROR='error'; const LEVEL_INFO='info'; const LEVEL_PROFILE='profile'; CLogger为所有日志写入和获取提供接口,通过日志路由管理类CLogRouter将日志分发到不同日志展现或存储介质中. 日志组件配置 [php]

YII框架分析笔记1:YII执行流程

yii整体执行流程直观,具体由以下步骤: 1.程序入口文件index.php加载yii框架引导程序(bootstrap)文件yii.php,加载配置文件以及其他自定义配置. 2.yii.php中Yii类继承了YiiBase,主要封装框架的一些通用方法,比如自动加载.创建组件.核心类路径映射.记录日志以及调试等,YiiBase.php中注册自动加载方法.另外Yii类预留可以自定义一些方法作为扩展. 3.回到index.php,Yii::createWebApplication($config),创

Backbone事件机制核心源码(仅包含Events、Model模块)

一.应用场景 为了改善酷版139邮箱的代码结构,引入backbone的事件机制,按照MVC的分层思想搭建酷版云邮局的代码框架.力求在保持酷版轻量级的基础上提高代码的可维护性. 二.遗留问题 1.backbone的升级问题,新的特性无法引入 2.backbone中的潜在BUG,若官方已修复则无法同步更新 解决办法: 关注backbone官网的更新记录. http://github.com/documentcloud/backbone/ 三.核心源码 /** * @裁剪版backbone,仅包含Ev