组件事件
1. 定义事件 onClick();
2. 注册事件句柄
3. 触发事件
[php]
public function onClicked($event)
{
$this->raiseEvent('onClicked', $event);
}
这里作为事件参数的 $event 是 [CEvent] 或其子类的实例。
我们可以附加一个方法到此 event,如下所示:
[php]
$component->onClicked=$callback;
这里的 $callback 指向了一个有效的 PHP 回调。它可以是一个全局函数也可以是类中的一个方法。
如果是后者,它必须以一个数组的方式提供: array($object,'methodName').
事件句柄的结构如下:
[php]
function methodName($event)
{
......
}
这里的 $event 即描述事件的参数(它来源于 raiseEvent() 调用)。$event 参数是 [CEvent] 或其子类的实例。
至少,它包含了关于谁触发了此事件的信息。
从版本 1.0.10 开始,事件句柄也可以是一个PHP 5.3以后支持的匿名函数。例如
[php]
$component->onClicked=function($event) {
......
}
如果我们现在调用 onClicked(),onClicked 事件将被触发(在 onClicked() 中), 附属的事件句柄将被自动调用。
一个事件可以绑定多个句柄。当事件触发时, 这些句柄将被按照它们绑定到事件时的顺序依次执行。
如果句柄决定组织后续句柄被执行,它可以设置 [$event->handled|CEvent::handled] 为 true
示例:
1.事件的定义:
2.注册事件句柄
$app = Yii::createWebApplication($config);
$app->onBeginRequest = function($event){
$msg = print_r($event,true);
file_put_contents(dirname(YII_PATH).'/test.txt',$msg);
};
$app->run();
3.触发事件:
结果:
原理分析:
Event中往往有两个角色,一个是Event,一个是Event Handler。为什么需要两个?
原因很容易理解,Event只是说明这件事情发生了,但是没有说怎么处理。这部分处理的工作当然是留给了Event Handler了。
1.在Yii中Event一般是在CComponet的子类中扩展出来的,一般以on开头。
public function onClick($event)
{
$this->raiseEvent('onClick',$event);
}
上面是一段例子,用来定义Event的。但是你要注意这里的$event可不是我们前面说的Event,而应该说$event和这个onClick函数整体构成了一个Event,
其实这也很容易理解,因为一个Event的构成需要一个标志说明Event发生,还需要一些数据来说明这个Event发生时的情况。
Event Handle 存放到 $this->_e[$eventName] = EventHandle 中。
EventHandle 是一个 CList 类。
调用时
http://www.yiichina.com/doc/guide/1.1/basics.component
http://www.phpstudio.info/show-155-1293-1.html
http://blog.csdn.net/chengfei112233/article/details/7659768
http://stackoverflow.com/questions/7410045/how-to-use-events-in-yii