学习yii2.0——事件

时间:2022-10-20 20:37:23

  参考: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事件,对应的事件都会被调用:
		// 孩子哭了,因为肚子饿
		// 闭嘴
		// 孩子哭了,因为肚子饿
		// 闭嘴
	}
}