框架中提供了事件机制,可以方便全局调用。其中系统默认已提供的有beforeAction
,afterAction
,onException
,onSql
这几个
beforeAction
为Action执行前执行的事件(在init()
方法之后被触发)
afterAction
为Action执行后执行的事件(会在渲染页面之前触发)
onException
系统抛出异常时被触发,会传递错误code
,在/config/exception.php
中定义code
对应的错误描述。
onSql
执行语句时被触发,上述例子中的event::on(onSql)
就是使用了该事件
定义事件
系统提供了两种定义事件的方式,一种是定义长期事件$fd = event::on($event, [$class, $method])
,直到被off之前都会生效。
参数分别为事件名
,方法[类,方法名]
$fd
返回的是该事件的操作符。在调用off方法时,可以通过传递该操作符解绑该事件。
namespace control;
/**
* 主页Action
*/
class ctl_index extends ctl_base
{
//构造函数
public function init()
{
// 要触发beforeAction事件,可在init里定义,会在init之后被触发
event::on(beforeAction, array($this, 'test_event'));
}
//默认路由index
public function index()
{
// 绑定testService里的my_event1方法 和 my_event2方法 到 myEvent事件中,两个方法都会被执行,按绑定先后顺序执行
$fd1 = event::on('myEvent', array($this->testService, 'my_event1'));
$fd2 = event::on('myEvent', array($this->testService, 'my_event2'));
// do something .....
// 解绑myEvent事件的 my_event1方法
event::off('myEvent', $fd1);
// 解绑myEvent事件,所有绑定在该事件上的方法都不会再被执行
event::off('myEvent');
exit('测试一下');
}
// 自定义的事件类
public function test_event($event)
{
// addLog为写日志的方法
log::info('触发beforeAction事件');
}
}
另一种绑定则为一次绑定事件event::one()
,调用参数相同,返回$fd
操作符,当该事件被触发一次后会自动解绑
$fd = event::one('myEvent', array($this, 'my_event'));
当然如果想要绑定多次但非长期绑定时,系统也提供了bind
方法,参数用法类似。
// 第一个参数绑定方法,第二个为事件名,第三个为绑定次数,触发次数满后自动释放
$fd = event::bind(array($this, 'my_event'), 'myEvent', $times);
触发事件
用户可以自定义事件,同时也可以选择性的触发,可以直接使用event::trigger($event, $params)
方法
参数有两个,第一个为触发的事件名,第二个为触发传递的参数,会传递到触发方法中执行
// 触发myEvent事件
event::trigger('myEvent', array(get_class($this), 'test'))
// 定义事件时绑定的方法
public function my_event($event, $params)
{
// array('testService', 'test')
var_dump($params);
}