经过事件(Event)处理,能够在某个特定时刻执行指定的代码,能够解耦代码,同时也增长了可维护性,一般,事件在客户端软件中比较好理解,好比onClick,onFocus,当点击按钮,获取到焦点时执行指定代码。在PHP中,事件的处理可能不太好理解,可是,只要理清了事件处理的过程,一切都会变得简单:yii2
1.注册(或者说绑定)针对某个动做事件的处理器(handler)app
2.触发某个动做事件yii
3.触发1中注册(绑定)的处理器函数
4.执行处理器中的代码post
下面以 猫叫鼠跑 这个例子来简单说明Yii2中的事件处理。this
Controller中的代码:spa
1对象 2事件 3get 4 5 6 7 8 9 10 |
public function actionTest(){ $cat = new Cat('Tom'); $mouse = new Mouse('Jerry');
$data = array('msg'=>'miaow miaow miaow!'); //注册Cat::EVENT_AFTER_SHOUT事件响应(这里对Cat的EVENT_AFTER_SHOUT响应$mouse 的runout方法) $cat->on(Cat::EVENT_AFTER_SHOUT, [$mouse,'runout'], $data); //触发shout事件 $cat->shout(); } |
Cat类代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class Cat extends \yii\base\Component{ private $_name; const EVENT_AFTER_SHOUT = 'afterShout';
function __construct($name) { $this->_name = $name; }
public function shout(){ echo 'I am a Cat,I am shouting!'; //触发事件处理 $this->trigger(self::EVENT_AFTER_SHOUT); } } |
Mouse类代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Mouse extends \yii\base\Component{ private $_name;
function __construct($_name) { $this->_name = $_name; }
public function runout($event){ //事件名称,事件数据,事件发送者 var_dump($event->name,$event->data,$event->sender); echo 'Cat is shouting,I am a mouse so I need to run!'; } } |
执行actionTest时,会依次输出如下结果
1 |
I am a Cat,I am shouting! |
1 |
Cat is shouting,I am a mouse so I need to run! |
在Yii2中,事件分为三个级别:
1.实例事件(同上面的例子,仅对某个实例有效)
2.类事件(对整个类有效)
1 2 3 4 5 6 7 |
yii\base\Event::on( Cat::className(), // 第一个参数表示事件发生的类 Cat::EVENT_AFTER_SHOUT, // 第二个参数表示是什么事件 function ($event) { // 对事件的处理 echo $event->sender; } ); |
3.全局事件(对全局有效)
1 2 3 |
Yii::$app->on('eventName', function ($event) { echo get_class($event->sender); // 显示当前触发事件的对象的类名称 }); |
除了绑定事件外,某些场合也须要移除绑定的事件,经常使用方法有如下几种:
PHP
1 2 3 4 5 6 7 8 |
// 删除全部EVENT_AFTER_SHOUT事件的handler $cat->off(Cat::EVENT_AFTER_SHOUT);
// 删除一个对象的成员函数的handler $cat->off(Cat::EVENT_AFTER_SHOUT, [$mouse, 'runout']);
// 删除一个PHP全局函数的handler $cat->off(Cat::EVENT_AFTER_SHOUT, 'global_onAfterShout'); |