参考:https://www.yiichina.com/doc/guide/2.0/concept-events
事件
yii框架中的事件定义和JavaScript中的事件定义差不多:为某个事件绑定一些操作,如果这个事件被触发,那么绑定的操作就会被执行。
这里有两个概念:事件与事件处理程序
事件,泛指某个操作,比如孩子饿哭了。而事件处理程序就是对应的操作,比如大人去煮饭。
如果一个类需要绑定、触发、取消事件,都需要yii\base\Component这个类的支持。
事件处理程序
yii框架中的事件处理程序可以是一下四种:
- 字符串形式指定的 PHP 全局函数,如
'trim'
; - 对象名和方法名数组形式指定的对象方法,如
[$object, $method]
; - 类名和方法名数组形式指定的静态类方法,如
[$class, $method]
; - 匿名函数,如
function ($event) { ... }
。
事件操作
绑定事件
yii框架中提供的绑定事件方法和jQuery中绑定事件的格式很相似: $obj->on(event, event_handler)。
其中,event是事件的名称,可以随意指定,需要注意的是,绑定事件的时候用的什么event名称,那么在解除事件或者触发事件的时候,也必须使用该名称才能出发该事件。
触发事件
在类中的方法内部使用$this->trigger(event),注意这个类必须继承yii\base\Component类。
取消事件
使用$obj->off(event, event_handler)来取消事件。
下面是一个完整的事件绑定、触发、取消的实例
<?php
namespace app\controllers; use yii\web\Controller;
use yii\base\Component;
use yii\base\Event; //要绑定事件或者触发事件的类要继承yii\base\Component
class Child extends Component {
public function Cry()
{
echo "孩子哭了,因为肚子饿<br>";
//当这个方法被调用的时候,触发事件。cry事件可以随意制定。
$this->trigger("cry");
}
} class Parents {
public function Cook()
{
echo "先别哭,老子马上做饭<br>";
} public static function Eat()
{
echo "吃饭吧<br>";
}
} class HelloController extends Controller {
public function actionOne()
{
$child1 = new Child();
$child2 = new Child();
$parents = new Parents(); //只为一个孩子绑定匿名函数作为事件处理程序
$child1->on("cry", function($e){
// print_r($e); //打印触发的事件信息
echo "闭嘴</br>";
}); //绑定其他事件处理程序(对象方法)
// $child1->on("cry", [$parents, "Cook"]);
//绑定其他事件处理程序(静态类方法)
// $child1->on("cry", ["app\controllers\Parents", "Eat"]);
//绑定其他事件处理程序(指定函数)
// $deal = function () {
// echo "shut up<br>";
// };
// $child1->on("cry", $deal);
// 取消事件
// $child1->off("cry", $deal); $child1->Cry(); //会触发cry事件,并且会调用事件处理程序
$child2->Cry(); //会触发cry事件,但是并不会调用事件处理程序
//输出:
//孩子哭了,因为肚子饿
//闭嘴
//孩子哭了,因为肚子饿
} public function actionTwo()
{
$child1 = new Child();
$child2 = new Child();
$parents = new Parents(); //为所有孩子绑定事件处理程序
//需要使用Event对象
Event::on(Child::className(), "cry", function($e){
// print_r($e);
echo "闭嘴<br>";
});
//使用这个方法同样可以绑定其他形式的事件处理程序格式。 //取消事件
// Event::off(Child::className(), "cry", "xxxx") $child1->Cry();
$child2->Cry();
//上面两个Cry方法中触发的cry事件,对应的事件都会被调用:
// 孩子哭了,因为肚子饿
// 闭嘴
// 孩子哭了,因为肚子饿
// 闭嘴
}
}
学习yii2.0——事件的更多相关文章
-
PHP观察者模式与Yii2.0事件
1.先看PHP观察者模式的实现: 想要使用事件.必须实现事件的基类.统一的addObserver和trigger方法 定义统一接口.所有的观察者都要实现此接口 //事件的基类 abstract cla ...
-
学习yii2.0——行为
学习yii框架的行为之前,需要先了解yii的事件,可以参考这篇博客: 怎么理解行为 yii框架的行为有点类似于trait,可以有个大体的概念: 1.有一个类A,包含一些属性和方法,很普通的一个类A. ...
-
学习yii2.0——基础入门
声明:本文内容来自于yiichina.com的权威指南. 安装 推荐使用composer来安全,可能有点慢(要下载的依赖比较多). composer create-project --prefer-d ...
-
学习 yii2.0——视图之间相互包含
布局 首先创建一个布局文件simple.php,路径是在views/layout/目录下. <p>this is header</p> <?= $content ?> ...
-
YII2.0--------这篇文章记录我学习YII2.0的过程吧,也可以让更多的人少走弯路
1.情况:今天我从github上下载了一个项目,本以为直接丢到根目录运行就行了,但是不行. 解决办法:首先安装git,安装步骤这里不讲了,稍微讲一下配置环境变量.
-
学习yii2.0——依赖注入
依赖注入 依赖注入是一种设计模式,可以搜索“php依赖注入”,这里不阐述了. yii框架的依赖注入 Yii 通过 yii\di\Container 类提供 DI 容器特性. 它支持如下几种类型的依赖注 ...
-
yii2.0发送qq邮件详情配置
首先要想使用qq发送邮件必须打开使用的qq邮箱里的一个配置,
-
Yii2.0 高级版安装 windows
最近在学习yii2.0 在安装高级版的时候遇到一些问题 索性解决了 下面分享一下 一.关于下载 自行百度,在Yii Framework 中文社区 下载专区下载高级应用程序模板(这边下载用电信网络不用下 ...
-
Elasticsearch5.3 学习(一):安装、Yii2.0 下载es扩展
Elasticsearch是一个基于Lucene,提供了一个分布式多用户能力的全文搜索引擎.其他就不多说了,官方文档有详细的介绍. 我自己是在CentOS 7.0安装的 Elasticsearch 是 ...
随机推荐
-
Multiple Contexts have a path of 错误
1.问题描述 在eclipse里面启动tomcat的时候,看到报错,multiple contexts have a path.tomcat启动失败 2.解决办法 删除tomcat,重新加载部署tom ...
-
jboss性能优化
jboss linux jboss 部署时优化设置: 在/conf/web.xml中通过参数指定: <session-config> <session-ti ...
-
mysql的source命令
第一次使用 source导入 sql 文件时,死活提示不成功,偶然发现在输入文件所在路径是,必须用 "/"斜杠,而不能是反斜框 "\".
-
三维世界的Gizmos
Unity和Maya 今天在美术同事那儿了解些Maya常识,加上自己在Unity3D中的一点儿小操作,记录一下Gizmos 之前就知道Maya和Unity3D的轴向是一致的,在同事那儿看他操作Maya ...
-
[Effective Java]第二章 创建和销毁对象
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
-
KVM: 安装Windows virtio半虚拟化驱动
Install KVM Windows virtio para-virtualized dirver If you can't read Chinese, there's an English ver ...
-
团队作业index
<head><meta http-equiv="Content-Type" content="text/html; charset=gb2312&quo ...
-
while (cin>;>;str)退出死循环
今天在练习的时候突然发现了这个问题,百度之感觉还挺常见的,故记之! //题目描述 // //写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串. // //输入描述 : //输入一个 ...
-
setTimeout 方法用于在指定的毫秒数后调用函数或计算表达式
setTimeout 方法用于在指定的毫秒数后调用函数或计算表达式
-
Delphi的String内存结构(够清楚) good
变量s的内存结构为(字符串编码)A8 03 (字符宽度)01 00 (引用计数)FF FF FF FF (字符串长度)0A 00 00 00 (实际内容)31 32 33 34 35 36 37 38 ...