Yii 事件处理器(事件handler)

来源:互联网 发布:如何评价储安平知乎 编辑:程序博客网 时间:2024/06/05 06:34

yii\base\Component中有一个private $_handler[]数组,用于保存该Component所有事件,该数组的下标为事件名,数组元素是形为一系列 [$handler, $data] 的数组。如链接中图所示


Component::on方法源代码:

public function on($name, $handler, $data = null, $append = true)
{
$this->ensureBehaviors();
if ($append || empty($this->_events[$name])) {
$this->_events[$name][] = [$handler, $data];
} else {
array_unshift($this->_events[$name], [$handler, $data]);
}
}


调用 yii\base\Component::on() 方法来附加处理器到事件上:
$foo = new Foo;// 处理器是全局函数$foo->on(Foo::EVENT_HELLO, 'function_name');
对象(对象静态)方法写成以数组的形式[$object,'methodName']
// 处理器是对象方法$foo->on(Foo::EVENT_HELLO, [$object, 'methodName']);
对象静态方法写成以数组的形式[\namespace\dir\classname,'methodName']// 处理器是静态类方法$foo->on(Foo::EVENT_HELLO, ['app\components\Bar', 'methodName']);// 处理器是匿名函数$foo->on(Foo::EVENT_HELLO, function ($event) { //事件处理逻辑});

移除事件处理器:
// 处理器是全局函数$foo->off(Foo::EVENT_HELLO, 'function_name');// 处理器是对象方法$foo->off(Foo::EVENT_HELLO, [$object, 'methodName']);// 处理器是静态类方法$foo->off(Foo::EVENT_HELLO, ['app\components\Bar', 'methodName']);// 处理器是匿名函数$foo->off(Foo::EVENT_HELLO, $anonymousFunction);


移除事件的全部处理器,简单调用 yii\base\Component::off() 即可
$foo->off(Foo::EVENT_HELLO);


匿名函数事件处理器注意事项:
注意当匿名函数附加到事件后一般不要尝试移除匿名函数,除非你在某处存储了它
0 0
原创粉丝点击