1. 程式人生 > >ThinkPHP3.2學習——架構_CBD模式

ThinkPHP3.2學習——架構_CBD模式

runtime 必須 希望 定制 檢測 nds 在外 數據庫 通過

ThinkPHP從3.0版本開始引入了全新的CBD(核心Core+行為Behavior+驅動Driver)架構模式,因為從底層開始,框架就采用核心+行為+驅動的架構體系,核心保留了最關鍵的部分,並在重要位置設置了標簽用以標記,其他功能都采用行為擴展和驅動的方式組合,開發人員可以根據自己的需要,對某個標簽位置進行行為擴展或者替換,就可以方便的定制框架底層,也可以在應用層添加自己的標簽位置和添加應用行為。而標簽位置類似於AOP概念中的“切面”,行為都是圍繞這個“切面”來進行編程。


一、Core(核心)

ThinkPHP的核心部分包括核心函數庫、慣例配置、核心類庫(包括基礎類和內置驅動及核心行為),這些是ThinkPHP必不可少的部分。

ThinkPHP/Common/functions.php // 核心函數庫
ThinkPHP/Conf/convention.php  // 慣例配置文件
ThinkPHP/Conf/debug.php  // 慣例調試配置文件
ThinkPHP/Mode/common.php  // 普通模式定義文件
ThinkPHP/Library/Think // 核心類庫包
ThinkPHP/Library/Behavior // 系統行為類庫
ThinkPHP/Library/Think/App.class.php // 核心應用類
ThinkPHP/Library/Think/Behavior.class.php // 基礎行為類
ThinkPHP/Library/Think/Cache.class
.php // 核心緩存類 ThinkPHP/Library/Think/Controller.class.php // 基礎控制器類 ThinkPHP/Library/Think/Db.class.php // 數據庫操作類 ThinkPHP/Library/Think/Dispatcher.class.php // URL解析調度類 ThinkPHP/Library/Think/Exception.class.php // 系統基礎異常類 ThinkPHP/Library/Think/Hook.class.php // 系統鉤子類 ThinkPHP/Library/Think/Log.class.php // 系統日誌記錄類 ThinkPHP/Library/Think/Model.class
.php // 系統基礎模型類 ThinkPHP/Library/Think/Route.class.php // 系統路由類 ThinkPHP/Library/Think/Storage.class.php // 系統存儲類 ThinkPHP/Library/Think/Template.class.php // 內置模板引擎類 ThinkPHP/Library/Think/Think.class.php // 系統引導類 ThinkPHP/Library/Think/View.class.php // 系統視圖類

Behavior目錄下面是系統內置的一些行為類庫,內置驅動則分布在各個不同的驅動目錄下面(參考下面的驅動部分)。


二、Driver(驅動)  

3.2在架構設計上更加強化了驅動的設計,替代了之前的引擎和模式擴展,並且改進了行為的設計,使得框架整體更加靈活,並且由於在需要寫入數據的功能類庫中都采用了驅動化的設計思想,所以使得新的框架能夠輕松滿足分布式部署的需求,對雲平臺的支持可以更簡單的實現了。因此,在新版的擴展裏面,已經取消了引擎擴展和模式擴展,改成配置不同的應用模式即可。

ThinkPHP/Library/Think/Cache/Driver // 緩存驅動類庫
ThinkPHP/Library/Think/Db/Driver // 數據庫驅動類庫
ThinkPHP/Library/Think/Log/Driver // 日誌記錄驅動類庫
ThinkPHP/Library/Think/Session/Driver // Session驅動類庫
ThinkPHP/Library/Think/Storage/Driver // 存儲驅動類庫
ThinkPHP/Library/Think/Template/Driver // 第三方模板引擎驅動類庫
ThinkPHP/Library/Think/Template/TagLib // 內置模板引擎標簽庫擴展類庫

三、Behavior(行為)  

行為(Behavior)是ThinkPHP擴展機制中比較關鍵的一項擴展,行為既可以獨立調用,也可以綁定到某個標簽(位)中進行偵聽。這裏的行為指的是一個比較抽象的概念,你可以想象成在應用執行過程中的一個動作或者處理,在框架的執行流程中,各個位置都可以有行為產生,例如路由檢測是一個行為,靜態緩存是一個行為,用戶權限檢測也是行為,大到業務邏輯,小到瀏覽器檢測、多語言檢測等等都可以當做是一個行為,甚至說你希望給你的網站用戶的第一次訪問彈出Hello,world!這些都可以看成是一種行為,行為的存在讓你無需改動框架和應用,而在外圍通過擴展或者配置來改變或者增加一些功能。

而不同的行為之間也具有位置共同性,比如,有些行為的作用位置都是在應用執行前,有些行為都是在模板輸出之後,我們把這些行為發生作用的位置稱之為標簽(位),也可以稱之為鉤子,當應用程序運行到這個標簽的時候,就會被攔截下來,統一執行相關的行為,類似於AOP編程中的“切面”的概念,給某一個標簽綁定相關行為就成了一種類AOP編程的思想。

系統標簽位

系統核心提供的標簽位置包括(按照執行順序排列):

  • app_init 應用初始化標簽位
  • module_check 模塊檢測標簽位(3.2.1版本新增
  • path_info PATH_INFO檢測標簽位
  • app_begin 應用開始標簽位
  • action_name 操作方法名標簽位
  • action_begin 控制器開始標簽位
  • view_begin 視圖輸出開始標簽位
  • view_template 視圖模板解析標簽位
  • view_parse 視圖解析標簽位
  • template_filter 模板解析過濾標簽位
  • view_filter 視圖輸出過濾標簽位
  • view_end 視圖輸出結束標簽位
  • action_end 控制器結束標簽位
  • app_end 應用結束標簽位

在每個標簽位置,可以配置多個行為,行為的執行順序按照定義的順序依次執行。除非前面的行為裏面中斷執行了(某些行為可能需要中斷執行,例如檢測機器人或者非法執行行為),否則會繼續下一個行為的執行。

除了這些系統內置標簽之外,開發人員還可以在應用中添加自己的應用標簽,在任何需要攔截的位置添加如下代碼即可:

tag(‘my_tag‘); // 添加my_tag 標簽偵聽
// 下面的寫法作用一致
\Think\Hook::listen(‘my_tag‘);

tag函數用於設置某個標簽位,可以傳入並且只接受一個參數,如果需要傳入多個參數,請使用數組,

tag(‘my_tag‘,$params); // 添加my_tag 標簽偵聽

該參數為引用傳值,所以只能傳入變量,因此下面的傳值是錯誤的:

tag(‘my_tag‘,‘param‘); // 添加my_tag 標簽偵聽
核心行為

系統的很多核心功能也是采用行為擴展組裝的,對於滿足項目日益紛繁復雜的需求和定制底層框架提供了更多的方便和可能性。

核心行為位於 ThinkPHP/Behavior/ 目錄下面,框架核心內置的行為包括如下:

行為名稱說明對應標簽位置
BuildLite 生成Lite文件(3.2.1版本新增) app_init
ParseTemplate 模板文件解析,並支持第三方模板引擎驅動 view_parse
ShowPageTrace 頁面Trace功能行為,完成頁面Trace功能 view_end
ShowRuntime 運行時間顯示行為,完成運行時間顯示 view_filter
TokenBuild 令牌生成行為,完成表單令牌的自動生成 view_filter
ReadHtmlCache 讀取靜態緩存行為 app_init
WriteHtmlCache 生成靜態緩存行為 view_filter
行為定義

自定義的擴展行為可以放在核心或者應用目錄,只要遵循命名空間的定義規則即可。 行為類的命名采用:行為名稱(駝峰法,首字母大寫)+Behavior 行為類的定義方式如下:

namespace Home\Behavior;
use Think\Behavior;
class TestBehavior extends Behavior {
     // 行為擴展的執行入口必須是run
     public function run(&$params){
         if(C(‘TEST_PARAM‘)) {
             echo ‘RUNTEST BEHAVIOR ‘.$params;
         }
     }
}

3.2.1版本開始,行為類的定義無需繼承Think\Behavior類,所以,上面的定義可以簡化為:

namespace Home\Behavior;
class TestBehavior {
     // 行為擴展的執行入口必須是run
     public function run(&$params){
         if(C(‘TEST_PARAM‘)) {
             echo ‘RUNTEST BEHAVIOR ‘.$params;
         }
     }
}

行為類必須定義執行入口方法run,由於行為的調用機制影響,run方法不需要任何返回值,所有返回都通過引用返回。run方法的參數只允許一個,但可以傳入數組。

行為綁定

行為定義完成後,就需要綁定到某個標簽位置才能生效,否則是不會執行的。

我們需要在應用的行為定義文件tags.php文件中進行行為和標簽的位置定義,格式如下:

return array(
     ‘標簽名稱1‘=>array(‘行為名1‘,‘行為名2‘,...), 
     ‘標簽名稱2‘=>array(‘行為名1‘,‘行為名2‘,...), 
 );