Yaf支持用戶定義插件來擴展Yaf的功能, 這些插件都是一些類. 它們都必須繼承自Yaf_Plugin_Abstract. 插件要發揮功效, 也必須現實的在Yaf中進行注冊, 然后在適當的實際, Yaf就會調用它.
### Yaf支持的Hook
| 名稱 | 觸發時機 | 說明 |
| -- | -- | -- |
| routerStartup | 在路由之前觸發 | 這個是7個事件中, 最早的一個. 但是一些全局自定的工作, 還是應該放在Bootstrap中去完成 |
| routerShutdown |路由結束之后觸發 | 此時路由一定正確完成, 否則這個事件不會觸發 |
| dispatchLoopStartup |分發循環開始之前被觸發 | |
| preDispatch |分發之前觸發 | 如果在一個請求處理過程中, 發生了forward, 則這個事件會被觸發多次 |
| postDispatch |分發結束之后觸發 | 此時動作已經執行結束, 視圖也已經渲染完成. 和preDispatch類似, 此事件也可能觸發多次 |
| dispatchLoopShutdown | 分發循環結束之后觸發 | 此時表示所有的業務邏輯都已經運行完成, 但是響應還沒有發送 |
### 定義插件
插件類是用戶編寫的, 但是它需要繼承自Yaf_Plugin_Abstract. 對于插件來說, 上一節提到的7個Hook, 它不需要全部關心, 它只需要在插件類中定義和上面事件同名的方法, 那么這個方法就會在該事件觸發的時候被調用.
而插件方法, 可以接受倆個參數, Yaf_Request_Abstract實例和Yaf_Response_Abstract實例. 一個插件類例子如下:
plugins/User.php
`<?php
class UserPlugin extends Yaf_Plugin_Abstract {
public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
}
public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
}
}`
### 注冊插件
插件要生效, 還需要向Yaf_Dispatcher注冊, 那么一般的插件的注冊都會放在Bootstra中進行. 一個注冊插件的例子如下:
`<?php
class Bootstrap extends Yaf_Bootstrap_Abstract{
public function _initPlugin(Yaf_Dispatcher $dispatcher) {
$user = new UserPlugin();
$dispatcher->registerPlugin($user);
}
}`
### 目錄
一般的, 插件應該放置在APPLICATION_PATH下的plugins目錄, 這樣在自動加載的時候, 加載器通過類名, 發現這是個插件類, 就會在這個目錄下查找.
當然, 插件也可以放在任何你想防止的地方, 只要你能把這個類加載進來就可以