# 事件/Events
事件是现代 web 应用中用于通信的一个流行概念。事件在代码执行的某个阶段被触发。扩展中的任何其他代码,都可以注册一个或多个事件,并在特定的时间执行操作。
事件由它的标识符定义,标识符是一段独一无二的字符串。(例如,`boot` 是在 Pagekit 应用程序的启动阶段触发的事件)。
在此文档中,你将了解所有可以监听的可用事件,以及如何在 Pagekit 中注册事件监听器。
## 系统事件
Pagekit 在页面请求的生命周期内提供了一系列事件:
- `boot`: Pagekit 应用开始运行的启动阶段
- `request`: 内核的请求处理已启动
- `controller`: 即将被调用的控制器操作
- `response`: 即将被发送到浏览器的响应
- `terminate`: Pagekit 应用程序的响应已成功发出
- `exception`: 发生的异常/An exception has occured.
## 授权事件/Auth-Events
所有授权相关事件都在这里定义: `Pagekit\Auth\AuthEvents`.
## 数据库与实体管理器 Database / EntityManager
对于每个实体被加载(loaded)、更新(updated)、创建(created),都会触发特定的事件。例如,如果小工具被加载了,就会触发 `model.widget.init` 事件。
实体事件名称的架构是 `model.entity_short_name.event_name`。这个泛型事件系统允许你监听单个实体。
可以在这里找到所有实体管理器事件:`Pagekit\Database\Events`。
## 路由
路由在执行前后会触发一个事件。每个事件名称都包含在已执行的 url 中: `before@site/api/node/save` 或 `after@system/settings/save`
## 注册事件监听器 EventListener
我们来注册一个在页面被保存时调用的事件监听器。
必须在包的`index.php` 中注册监听器:
```
return [
// 你的包的定义
'events' => [
'boot' => function ($event, $app) {
$app->subscribe(new \Acme\Listener\PostSaveListener());
}
]
];
```
监听器代码:
```
<?php
namespace Acme\Listener;
use Pagekit\Event\Event;
use Pagekit\Event\EventSubscriberInterface;
class PostSaveListener implements EventSubscriberInterface
{
/**
* {@inheritdoc}
*/
public function subscribe()
{
return [
'model.page.saved' => 'onSaved',
];
}
/**
* @param Event $event
* @param object $model The saved entity
*/
public function onSaved(Event $event, $model)
{
// your code
}
}
```