今天学习YII框架的事件机制,某个对象可以抛出一些事件,而其他的对象可以监听这些事件,然后调用相应的方法。而具体的实现方式可以分为扫描式和绑定式。而YII框架使用的就是绑定式。下面来详细讲解一下。
所谓绑定式,是由事件执行时,通过Component类下的trigger()方法抛出事件,然后通过on()方法来绑定其他对象对此事件的反应。下面通过一个简单的猫叫老鼠跑的例子来说明。这个一个一对一的事件机制。
1.一个一对一的事件机制
cat.php
namespace vendor\animal;
use \yii\base\Component;
class MyEvent extends Event{
public $message;
}
class Cat extends Component{
public function shout(){
echo 'cat miao<br>';
$this->trigger('miao',$me);
}
}
mouse.php
namespace vendor\animal;
class Mouse{
public function run(){
echo 'mouse running<br>';//老鼠跑事件
}
}
控制器
namespace app\controllers;
use yii\web\Controller;
use vendor\animal\Cat;
use vendor\animal\Mouse;
use vendor\animal\Dog;
use \yii\base\Event;
class HelloController extends Controller{
public function actionAbout(){
$cat = new Cat;
$mouse = new Mouse;
$cat->on('miao',[$mouse,'run']);//为miao事件绑定老鼠跑事件
$cat->shout();
}
}
输出为
miao
mouse running
2.带参数的事件
有的时候,事件需要参数才能让其他对象反应的,比如报警119,需要告知着火地点。可以通过trigger来写入事件信息。
cat.php
namespace vendor\animal;
use \yii\base\Component;
use \yii\base\Event;
class MyEvent extends Event{
public $message;
}
class Cat extends Component{
public function shout(){
echo 'cat miao<br>';//猫叫事件
$me = new MyEvent;
$me->message = 'hello<br>';//事件参数
$this->trigger('miao',$me);//抛出名为miao的事件,附上参数$me对象
}
}
mouse.php
namespace vendor\animal;
class Mouse{
public function run($me){
echo $me->message;
echo 'mouse running<br>';//老鼠跑事件
}
}
输出
miao
hello
mouse running
3.触发多个事件
可以加上dog.php
namespace vendor\animal;
class Dog{
public function run($me){
echo $me->message;
echo 'dog catch<br>';
}
}
控制器加上
$cat->on('miao',[$dog,'run']);
要想接触绑定
$cat->off('miao',[$dog,'run']);
输出
miao
hello
mouse running
hellodog catch
4.类触发事件
有的时候,不只是某只实例化的猫,只要是只猫叫就想让老鼠跑的话,可以这么写on
Event::on(Cat::className(),'miao',[$mouse,'run']);