文档章节

Yii2之事件处理

 小田天
发布于 2016/11/17 11:30
字数 642
阅读 8
收藏 0
点赞 0
评论 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
博文 78
码字总数 49841
作品 0
怀化
yii2 - Behavior 实例及源码分析

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

big_cat ⋅ 2016/06/01 ⋅ 0

yii2 - Event 实例及源码分析

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

big_cat ⋅ 2016/05/27 ⋅ 0

从配置文件的角度去了解Yii2

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

Vett ⋅ 2017/12/23 ⋅ 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

yii2项目实战之配置

作者:白狼 出处:http://www.manks.top/document/yii2-blog-config.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律...

白狼栈 ⋅ 2016/08/01 ⋅ 0

yii2源码分析之执行基本流程

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

china_lx1 ⋅ 04/22 ⋅ 0

Yii2 源码分析 - 入口文件执行流程

以 yii 2.0.14 高级版的 frontend 为例,从 frontend/web/index.php 开始 入口文件看着就这么几行,简单的很,那他是怎么通过这几行来运行应用的呢?先看 Yii.php 内的逻辑 接下来,就是重头...

botkenni ⋅ 05/03 ⋅ 0

Yii2 实例管理

Yii2 实例管理 Yii2框架没有提供类似ZendFramework3中提供的ServiceManager.那么Yii2框架是如何管理对象实例的呢? 长时间使用Yii2框架的童鞋一定已经适应了对象中的public变量,以及一个来自y...

Vett ⋅ 2017/12/23 ⋅ 0

yii2学习——事件(event)

最近在学习Yii2,这里记录一下学习yii2的事件,一个简单的事件实例: 包括了一个对象、一个静态对象、一个匿名函数。 appcontrollerssiteController /** * 事件处理 */ public function act...

卖小女孩的小火柴 ⋅ 2015/05/05 ⋅ 5

小紫羽/yii2-fast-api

yii2-fast-api yii2-fast-api是一个Yii2框架的扩展,用于配置完善Yii2,以实现api的快速开发。 此扩展默认的场景是APP的后端接口开发,因此偏向于实用主义,并未完全采用restfull的标准,方便...

小紫羽 ⋅ 2017/01/20 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

开启远程SSH

SSH默认没有开启账号密码登陆,需要再配置表中修改: vim /etc/ssh/sshd_configPermitRootLogin yes #是否可以使用root账户登陆PasswordAuthentication yes #是都开启密码登陆ser...

Kefy ⋅ 7分钟前 ⋅ 0

Zookeeper3.4.11+Hadoop2.7.6+Hbase2.0.0搭建分布式集群

有段时间没更新博客了,趁着最近有点时间,来完成之前关于集群部署方面的知识。今天主要讲一讲Zookeeper+Hadoop+Hbase分布式集群的搭建,在我前几篇的集群搭建的博客中已经分别讲过了Zookeep...

海岸线的曙光 ⋅ 14分钟前 ⋅ 0

js保留两位小数方法总结

本文是小编针对js保留两位小数这个大家经常遇到的经典问题整理了在各种情况下的函数写法以及遇到问题的分析,以下是全部内容: 一、我们首先从经典的“四舍五入”算法讲起 1、四舍五入的情况...

孟飞阳 ⋅ 32分钟前 ⋅ 0

python log

python log 处理方式 log_demo.py: 日志代码。 #! /usr/bin/env python# -*- coding: utf-8 -*-# __author__ = "Q1mi""""logging配置"""import osimport logging.config# 定义三种......

inidcard ⋅ 47分钟前 ⋅ 0

mysql 中的信息数据库以及 shell 查询 sql

Information_schema 是 MySQL 自带的信息数据库,里面的“表”保存着服务器当前的实时信息。它提供了访问数据库元数据的方式。 什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,...

blackfoxya ⋅ 49分钟前 ⋅ 0

maven配置阿里云镜像享受飞的感觉

1.在maven目录下的conf/setting.xml中找到mirrors添加如下内容,对所有使用改maven打包的项目生效。 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.al......

kalnkaya ⋅ 49分钟前 ⋅ 0

centos7下创建新用户并授权

1、创建新用户 创建一个用户名为:test adduser test 创建初始密码: passwd test 2、授予root权限 个人用户的权限只可以在/home/test下有完整权限,其他目录要看别人授权。而经常需要roo...

xixingzhe ⋅ 53分钟前 ⋅ 0

求助:TiledMap如何旋转对象呢?

比如我要旋转一个梯子的角度,单纯在TiledMap旋转角度好像没有效果。那是要用代码来控制角度,还是说只能通过导入相对应的斜的图片才可以呢?

花谢自相惜 ⋅ 54分钟前 ⋅ 0

Micronaut 之HelloWorld!

小试一下Micronaut,按照官方文档跑了一下helloworld 第一步克隆,按照官方文档是: git clone git@github.com:micronaut-projects/micronaut-core.git 结果怎么是这样?? 换个方法吧 git ...

桂哥 ⋅ 今天 ⋅ 0

pom文件

Aeroever ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部