参考:https://www.yiichina.com/doc/guide/2.0/concept-events
事件
yii框架中的事件定义和JavaScript中的事件定义差不多:为某个事件绑定一些操作,如果这个事件被触发,那么绑定的操作就会被执行。
这里有两个概念:事件与事件处理程序
事件,泛指某个操作,比如孩子饿哭了。而事件处理程序就是对应的操作,比如大人去煮饭。
如果一个类需要绑定、触发、取消事件,都需要yiiaseComponent这个类的支持。
事件处理程序
yii框架中的事件处理程序可以是一下四种:
- 字符串形式指定的 PHP 全局函数,如
'trim'
; - 对象名和方法名数组形式指定的对象方法,如
[$object, $method]
; - 类名和方法名数组形式指定的静态类方法,如
[$class, $method]
; - 匿名函数,如
function ($event) { ... }
。
事件操作
绑定事件
yii框架中提供的绑定事件方法和jQuery中绑定事件的格式很相似: $obj->on(event, event_handler)。
其中,event是事件的名称,可以随意指定,需要注意的是,绑定事件的时候用的什么event名称,那么在解除事件或者触发事件的时候,也必须使用该名称才能出发该事件。
触发事件
在类中的方法内部使用$this->trigger(event),注意这个类必须继承yiiaseComponent类。
取消事件
使用$obj->off(event, event_handler)来取消事件。
下面是一个完整的事件绑定、触发、取消的实例
<?php namespace appcontrollers; use yiiwebController; use yiiaseComponent; use yiiaseEvent; //要绑定事件或者触发事件的类要继承yiiaseComponent 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", ["appcontrollersParents", "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事件,对应的事件都会被调用: // 孩子哭了,因为肚子饿 // 闭嘴 // 孩子哭了,因为肚子饿 // 闭嘴 } }