学习yii2.0——事件
参考: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 是 ...
随机推荐
- Ubuntu下 MySQL的“ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)”
今天闲来无事,在Ubuntu上掏鼓一下mysql.但尴尬的是,当我输入mysql -u root -p的时候,抛出了一个错误:ERROR 1045 (28000): Access denied for ...
- mysql中的升序和降序以及一个字段升序和一个字段降序
mySql中,升序为asc,降序为desc.例如: 升序:select * from 表名 order by 表中的字段 asc(mysql中默认是升序排列,可不写) 降序:select ...
- win10安装nodejs遇到提示错误代码2503怎么办
我们在安装某个软件的时候,最闹心的就是遇到提示安装失败或错误,比如win10系统在安装nodejs遇到提示错误代码2503,遇见这个问题也不要慌张,今天小编就来告诉大家怎么解决这个问题. 1.打开智能 ...
- appium+robotframework常见技巧总结
1.如何输入中文 方法: 在open application参数最后,新增unicodeKeyboard=True resetKeyboard=True:不加入这两个参数时,中文无法输入 2.如 ...
- #004 C语言大作业学生管理系统试着做
链表不会用 文件不会使 在这种情况下就边写边做 希望这个月能做完这个作业 #include<stdio.h> #include<stdlib.h> #include<st ...
- Nginx使用教程(八):使用Nginx缓存之Memcached缓存
使用Memcache <br\>Memcache是一个通用的内存缓存系统. 它通常用于加速缓慢的数据访问. NGINXmemcached模块提供各种指令,可以配置为直接访问Memcache ...
- Window 中杀死指定端口 cmd 命令行 taskkill
https://www.cnblogs.com/xwer/p/7780571.html
- LeetCode练习3 找出一个字符串中最大不重复子字符串的长度
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...
- Pycharm 自定义快捷键
之前使用 Eclipse 时,快捷键 Ctrl + M 会使当前窗口最大化.这里配置 PyCharm 具有相同功能. 1)打开 File > Settings > Keymap 2 ...
- MySQL笔记--注意
replace into 和 insert into..... on duplicate key update的异同 同:1. 当key不存在时,两者相同,都是插入一条数据2. key存在时,执行两者 ...