事件

框架中提供了事件机制,可以方便全局调用。其中系统默认已提供的有beforeActionafterActiononExceptiononSql这几个

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);
}

Last updated