學習yaf(三)插件

使用插件

Yaf支持用戶定義插件來擴展Yaf的功能, 這些插件都是一些類. 它們都必須繼承自Yaf_Plugin_Abstract. 插件要發揮功效, 也必須現實的在Yaf中進行註冊, 而後在適當的實際, Yaf就會調用它.php

 

Yaf支持的Hook

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目錄, 這樣在自動加載的時候, 加載器經過類名, 發現這是個插件類, 就會在這個目錄下查找.繼承

固然, 插件也能夠放在任何你想防止的地方, 只要你能把這個類加載進來就能夠

 

一個UserPlugin插件的使用

首先在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

相關文章
相關標籤/搜索