> For the complete documentation index, see [llms.txt](https://doc.kaliphp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://doc.kaliphp.com/event.md).

# 事件

框架中提供了事件机制，可以方便全局调用。其中系统默认已提供的有`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);
}
```
