# 事件/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
}
}
```