事件
框架中提供了事件机制,可以方便全局调用。其中系统默认已提供的有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操作符,当该事件被触发一次后会自动解绑
当然如果想要绑定多次但非长期绑定时,系统也提供了bind方法,参数用法类似。
触发事件
用户可以自定义事件,同时也可以选择性的触发,可以直接使用event::trigger($event, $params)方法
参数有两个,第一个为触发的事件名,第二个为触发传递的参数,会传递到触发方法中执行
Last updated
Was this helpful?