yaf零基礎學習總結7-學習使用Yaf中的插件

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

也許你們會問這個插件是個什麼概念,有什麼用呢,其實咱們用插件主要是用到Yaf框架中支持的Hook(鉤子),Yaf中定義了6個Hook,他們分別是: 

Yaf中支持的6個Hook 

一、routerStartup 這個會在路由以前出發,也就是路由以前會調用這個Hook ,這個是7個事件中, 最先的一個. 可是一些全局自定的工做, 仍是應該放在Bootstrap中去完成 

二、routerShutdown 這個在路由結束以後觸發,須要注意的是,只有路由正確完成以後纔會觸發這個Hook 

三、dispatchLoopStartup 分發循環開始以前被觸發 

四、preDispatch 分發以前觸發,若是在一個請求處理過程當中, 發生了forward, 則這個事件會被觸發屢次 

五、postDispatch 分發結束以後觸發,此時動做已經執行結束, 視圖也已經渲染完成. 和preDispatch相似, 此事件也可能觸發屢次 

六、dispatchLoopShutdown 分發循環結束以後觸發 此時表示全部的業務邏輯都已經運行完成, 可是響應尚未發送 

定義插件 

以上只是對插件作了一個基本的介紹,若是此前沒有接觸過相似設計的可能一會兒稀裏糊塗的,其實也不要緊,當前最重要的就是記住,有這麼個印象,在後續咱們使用的過程中慢慢的就能接受了。 

插件類是用戶編寫的, 可是它須要繼承自Yaf_Plugin_Abstract. 對於插件來講, 上一節提到的7個Hook, 它不須要所有關心, 它只須要在插件類中定義和上面事件同名的方法, 那麼這個方法就會在該事件觸發的時候被調用. 

而插件方法, 能夠接受倆個參數, Yaf_Request_Abstract實例和Yaf_Response_Abstract實例. 一個插件類例子以下: php

[php]  view plain copy
 
  1. <?php  
  2.      class UserPlugin extends Yaf_Plugin_Abstract {  
  3.   
  4.      public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {  
  5.      }  
  6.   
  7.      public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {  
  8.      }  
  9.      }  



註冊插件 

插件要生效, 還須要向Yaf_Dispatcher註冊, 那麼通常的插件的註冊都會放在Bootstra中進行. 一個註冊插件的例子以下: html

[php]  view plain copy
 
  1. <?php  
  2. class Bootstrap extends Yaf_Bootstrap_Abstract{  
  3.   
  4.         public function _initPlugin(Yaf_Dispatcher $dispatcher) {  
  5.             $user = new UserPlugin();  
  6.             $dispatcher->registerPlugin($user);  
  7.         }  
  8. }  



插件目錄 

通常的, 插件應該放置在APPLICATION_PATH下的plugins目錄, 這樣在自動加載的時候, 加載器經過類名, 發現這是個插件類, 就會在這個目錄下查找.固然, 插件也能夠放在任何你想防止的地方, 只要你能把這個類加載進來就能夠 

這就是插件的使用過程,對於上面咱們作一個總結,用代碼來講話。 

首先咱們定義好本身的插件類: app

[php]  view plain copy
 
  1. /**  
  2. * 插件類定義 
  3. * UserPlugin.php 
  4. */   
  5. class UserPlugin extends Yaf_Plugin_Abstract {   
  6.     //在路由以前觸發,這個是7個事件中, 最先的一個. 可是一些全局自定的工做, 仍是應該放在Bootstrap中去完成   
  7.     public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {   
  8.         echo "Plugin routerStartup called <br/>\n";   
  9.     }   
  10. //路由結束以後觸發,此時路由必定正確完成, 不然這個事件不會觸發   
  11.     public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {   
  12.         echo "Plugin routerShutdown called <br/>\n";   
  13.     }   
  14. //分發循環開始以前被觸發   
  15.     public function dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {   
  16.         echo "Plugin DispatchLoopStartup called <br/>\n";   
  17.     }   
  18. //分發以前觸發    若是在一個請求處理過程當中, 發生了forward, 則這個事件會被觸發屢次   
  19.     public function preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {   
  20.         echo "Plugin PreDispatch called <br/>\n";   
  21.     }   
  22. //分發結束以後觸發,此時動做已經執行結束, 視圖也已經渲染完成. 和preDispatch相似, 此事件也可能觸發屢次   
  23.     public function postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {   
  24.         echo "Plugin postDispatch called <br/>\n";   
  25.     }   
  26.   //分發循環結束以後觸發,此時表示全部的業務邏輯都已經運行完成, 可是響應尚未發送   
  27.     public function dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {   
  28.         echo "Plugin DispatchLoopShutdown called <br/>\n";   
  29.     }   
  30.      
  31.     public function preResponse(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {   
  32.         echo "Plugin PreResponse called <br/>\n";   
  33.     }   
  34. }  



而後註冊咱們的插件,在上一節中咱們講到過Bootstrap的使用,這回咱們要用上它了,就是在Bootstrap註冊插件 

框架


 
  1. class Bootstrap extends Yaf_Bootstrap_Abstract{   
  2.   /** 
  3.    * 註冊一個插件 
  4.    * 插件的目錄是在application_directory/plugins 
  5.    */   
  6.   public function _initPlugin(Yaf_Dispatcher $dispatcher) {   
  7.     $user = new UserPlugin();   
  8.     $dispatcher->registerPlugin($user);   
  9.   }   
  10. }  



就這樣,插件就會在咱們的項目運行過程當中自動調用相關的Hook,咱們能夠在這些Hook中部署本身的業務邏輯,好比用戶是否須要登陸,權限判斷等。oop

相關文章
相關標籤/搜索