文档章节

Yii2之事件处理

 小田天
发布于 2016/11/17 11:30
字数 642
阅读 11
收藏 0

Yii2之事件处理

通过事件(Event)处理,可以在某个特定时刻执行指定的代码,可以解耦代码,同时也增加了可维护性,通常,事件在客户端软件中比较好理解,比如onClick,onFocus,当点击按钮,获取到焦点时执行指定代码。在PHP中,事件的处理可能不太好理解,但是,只要理清了事件处理的过程,一切都会变得简单:

1.注册(或者说绑定)针对某个动作事件的处理器(handler)

2.触发某个动作事件

3.触发1中注册(绑定)的处理器

4.执行处理器中的代码

 

下面以 猫叫鼠跑 这个例子来简单说明Yii2中的事件处理。

Controller中的代码:

 

1

2

3

4

5

6

7

8

9

10

public function actionTest(){

        $cat = new Cat('Tom');

        $mouse = new Mouse('Jerry');

        

        $data = array('msg'=>'miaow miaow miaow!');

        //注册Cat::EVENT_AFTER_SHOUT事件响应(这里对Cat的EVENT_AFTER_SHOUT响应$mouse 的runout方法)

        $cat->on(Cat::EVENT_AFTER_SHOUT, [$mouse,'runout'], $data);

        //触发shout事件

        $cat->shout();

}

Cat类代码:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

class Cat extends \yii\base\Component{

    private $_name;

    const EVENT_AFTER_SHOUT = 'afterShout';

    

    function __construct($name) {

        $this->_name = $name;

    }

    

    public function shout(){

        echo 'I am a Cat,I am shouting!';

        //触发事件处理

        $this->trigger(self::EVENT_AFTER_SHOUT);

    }

}

 

Mouse类代码:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

class Mouse extends \yii\base\Component{

    private $_name;

    

    function __construct($_name) {

        $this->_name = $_name;

    }

    

    public function runout($event){

        //事件名称,事件数据,事件发送者

        var_dump($event->name,$event->data,$event->sender);

        echo 'Cat is shouting,I am a mouse so I need to run!';

    }

}

执行actionTest时,会依次输出以下结果

 

1

I am a Cat,I am shouting!

 

 

1

Cat is shouting,I am a mouse so I need to run!

 

 

在Yii2中,事件分为三个级别:

1.实例事件(同上面的例子,仅对某个实例有效)

2.类事件(对整个类有效)

 

1

2

3

4

5

6

7

yii\base\Event::on(

    Cat::className(),                     // 第一个参数表示事件发生的类

    Cat::EVENT_AFTER_SHOUT,                  // 第二个参数表示是什么事件

    function ($event) {                      // 对事件的处理

        echo $event->sender;

    }

);

3.全局事件(对全局有效)

 

1

2

3

Yii::$app->on('eventName', function ($event) {

    echo get_class($event->sender);        // 显示当前触发事件的对象的类名称

});

 

 

除了绑定事件外,某些场合也需要移除绑定的事件,常用方法有以下几种:

PHP

 

1

2

3

4

5

6

7

8

// 删除所有EVENT_AFTER_SHOUT事件的handler

$cat->off(Cat::EVENT_AFTER_SHOUT);

 

// 删除一个对象的成员函数的handler

$cat->off(Cat::EVENT_AFTER_SHOUT, [$mouse, 'runout']);

 

// 删除一个PHP全局函数的handler

$cat->off(Cat::EVENT_AFTER_SHOUT, 'global_onAfterShout');

 

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 79
码字总数 49841
作品 0
怀化
私信 提问
yii2 - Behavior 实例及源码分析

Behavior 的简述 行为简单来说是组件的扩展,可以对组件的属性,方法,事件 (yii2组件的三大要点)进行扩展而无需改动组件现有的代码逻辑。即此行为所拥有的属性,方法,事件,都会被绑定它...

big_cat
2016/06/01
811
0
yii2 - Event 实例及源码分析

yii2 可以方便的使用 Event 组件基类 来实现 注册事件和监听触发 机制,每个事件都有自身的事件队列 首先要知道,yii2的事件一共有三类:对象级,类级,全局 Yii::$app 级 对象和 全局是通过...

big_cat
2016/05/27
188
0
从配置文件的角度去了解Yii2

前言 Yii2是一个奇特的框架,其牺牲了现在盛行的解耦设计,用一个高度耦合的结构提供给开发者一个方便的几类抽象,Application,Module,Component,甚至是ServiceLocator.想让对象具备哪类特征就直...

Vett
2017/12/23
0
0
Yii2框架图解

Yii2框架图解 Love冥天个人博客-关注IT|PHP|互联网|php个人博客交流2017-11-281 阅读 yii2Yii2 图片根据Yii类参考手册,Yii源代码,开发常用方法构成. 1.yii2 控制器类图 2.yii2 cookie 类图...

Love冥天个人博客-关注IT|PHP|互联网|php个人博客交流
2017/11/28
0
0
yii2源码分析之执行基本流程

用yii2框架用了将近2年,一直都没有去看过它底层源码, 马上快不用了,最近对其源码研究一番,哈哈 废话少说,上代码, 入口文件是web/index.php

china_lx1
04/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS官方钱包keosd

EOS官方钱包的名称是keosd,它负责管理你的私钥,并且帮你进行交易的签名。 不过不幸的是,keosd钱包对普通用户并不友好,它是一个命令行程序,目前还没有像以太坊的mist那样的图形化界面,而...

汇智网教程
今天
20
0
ArrayList的实现原理以及实现线程安全

一、ArrayList概述 ArrayList是基于数组实现的,是一个动态的数字,可以自动扩容。 ArrayList不是线程安全的,效率比较高,只能用于单线程的环境中,在多线程环境中可以使用Collections.syn...

一看就喷亏的小猿
今天
20
0
Netty 备录 (一)

入职新公司不久,修修补补1个月的bug,来了点实战性的技术---基于netty即时通信 还好之前对socket有所使用及了解,入手netty应该不是很难吧,好吧,的确有点难,刚看这玩意的时候,可能都不知道哪里...

_大侠__
昨天
30
0
Django简单介绍和用户访问流程

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。 Django遵守BSD版权,初...

枫叶云
昨天
36
0
Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

应用场景 之前我们已经通过《Spring Cloud Stream消费失败后的处理策略(一):自动重试》一文介绍了Spring Cloud Stream默认的消息重试功能。本文将介绍RabbitMQ的binder提供的另外一种重试...

程序猿DD
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部