Yaf支持用戶定義插件來擴展Yaf的功能, 這些插件都是一些類. 它們都必須繼承自Yaf_Plugin_Abstract. 插件要發揮功效, 也必須現實的在Yaf中進行註冊, 而後在適當的實際, Yaf就會調用它.php
Yaf定義了6個Hook, 它們分別是:html
Yaf的Hook瀏覽器
觸發順序 | 名稱 | 觸發時機 | 說明 |
---|---|---|---|
1 | routerStartup | 在路由以前觸發 | 這個是7個事件中, 最先的一個. 可是一些全局自定的工做, 仍是應該放在Bootstrap中去完成 |
2 | routerShutdown | 路由結束以後觸發 | 此時路由必定正確完成, 不然這個事件不會觸發 |
3 | dispatchLoopStartup | 分發循環開始以前被觸發 | |
4 | preDispatch | 分發以前觸發 | 若是在一個請求處理過程當中, 發生了forward, 則這個事件會被觸發屢次 |
5 | postDispatch | 分發結束以後觸發 | 此時動做已經執行結束, 視圖也已經渲染完成. 和preDispatch相似, 此事件也可能觸發屢次 |
6 | dispatchLoopShutdown | 分發循環結束以後觸發 | 此時表示全部的業務邏輯都已經運行完成, 可是響應尚未發送 |
插件類是用戶編寫的, 可是它須要繼承自Yaf_Plugin_Abstract. 對於插件來講, 上一節提到的7個Hook, 它不須要所有關心, 它只須要在插件類中定義和上面事件同名的方法, 那麼這個方法就會在該事件觸發的時候被調用.oop
而插件方法, 能夠接受倆個參數, Yaf_Request_Abstract實例和Yaf_Response_Abstract實例. 一個插件類例子以下:post
一個簡單的插件類spa
<?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) { } }
這個例子中, 插件UserPlugin只關心倆個事件. 因此就定義了倆個方法.插件
插件要生效, 還須要向Yaf_Dispatcher註冊, 那麼通常的插件的註冊都會放在Bootstra中進行. 一個註冊插件的例子以下:router
註冊插件htm
<?php class Bootstrap extends Yaf_Bootstrap_Abstract{ public function _initPlugin(Yaf_Dispatcher $dispatcher) { $user = new UserPlugin(); $dispatcher->registerPlugin($user); } }
通常的, 插件應該放置在APPLICATION_PATH下的plugins目錄, 這樣在自動加載的時候, 加載器經過類名, 發現這是個插件類, 就會在這個目錄下查找.繼承
固然, 插件也能夠放在任何你想防止的地方, 只要你能把這個類加載進來就能夠
首先在Plugins目錄下 新建User.php文件,由於yaf配置默認識別爲UserPlugin.php,你能夠在配置中修改是否攜帶後綴
/**
* 插件類定義
* User.php
*/
class UserPlugin extends Yaf_Plugin_Abstract {
//在路由以前觸發,這個是7個事件中, 最先的一個. 可是一些全局自定的工做, 仍是應該放在Bootstrap中去完成
public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
echo "Plugin routerStartup called <br/>\n";
}
//路由結束以後觸發,此時路由必定正確完成, 不然這個事件不會觸發
public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
echo "Plugin routerShutdown called <br/>\n";
}
//分發循環開始以前被觸發
public function dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
echo "Plugin DispatchLoopStartup called <br/>\n";
}
//分發以前觸發 若是在一個請求處理過程當中, 發生了forward, 則這個事件會被觸發屢次
public function preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
echo "Plugin PreDispatch called <br/>\n";
}
//分發結束以後觸發,此時動做已經執行結束, 視圖也已經渲染完成. 和preDispatch相似, 此事件也可能觸發屢次
public function postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
echo "Plugin postDispatch called <br/>\n";
}
//分發循環結束以後觸發,此時表示全部的業務邏輯都已經運行完成, 可是響應尚未發送
public function dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
echo "Plugin DispatchLoopShutdown called <br/>\n";
}
public function preResponse(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
echo "Plugin PreResponse called <br/>\n";
}
}
在Bootstrap中註冊插件
/**
* 插件的註冊
*/
public function _initPlugin(Yaf_Dispatcher $dispatcher) {
$user = new UserPlugin();
$dispatcher->registerPlugin($user);
}
這時候訪問瀏覽器 輸出以下
Plugin routerStartup called Plugin routerShutdown called Plugin DispatchLoopStartup called Plugin PreDispatch called Plugin postDispatch called Plugin DispatchLoopShutdown called Hello World