#1. 行爲是什麼php
行爲擴展官方文檔html
行爲(Behavior)是一個比較抽象的概念,你能夠想象成在應用執行過程當中的一個動做或者處理,在框架的執行流程中,各個位置均可以有行爲產生,例如路由檢測是一個行爲,靜態緩存是一個行爲,用戶權限檢測也是行爲,大到業務邏輯,小到瀏覽器檢測、多語言檢測等等均可以當作是一個行爲,甚至說你但願給你的網站用戶的第一次訪問彈出Hello,world!這些均可以當作是一種行爲。thinkphp
我的理解: 行爲確定是一個方法,這個方法是一個類中的方法,那就須要定義一個行爲類。 在框架執行流程中,遇到某個
標誌或者位置
就去執行某個行爲。編程
系統流程數組
#2. 行爲的做用 行爲的存在讓你無需改動框架和應用,而在外圍經過擴展或者配置來改變或者增長一些功能。瀏覽器
##2.1 行爲的共同性和行爲發生的標識(或者說位子)緩存
而不一樣的行爲之間也具備位置共同性,好比,有些行爲的做用位置都是在應用執行前,有些行爲都是在模板輸出以後,咱們把這些行爲發生做用的位置稱之爲標籤(位),app
>當應用程序運行到這個標籤的時候,就會被攔截下來,統一執行相關的行爲,相似於AOP編程中的「切面」的概念,給某一個切面綁定相關行爲就成了一種類AOP編程的思想。
#3.系統核心的標籤位框架
系統核心提供的標籤位置包括下面幾個(按照執行順序排列):網站
app_init 應用初始化標籤位 path_info PATH_INFO檢測標籤位 app_begin 應用開始標籤位 action_name 操做方法名標籤位 action_begin 控制器開始標籤位 view_begin 視圖輸出開始標籤位 view_parse 視圖解析標籤位 template_filter 模板內容解析標籤位 view_filter 視圖輸出過濾標籤位 view_end 視圖輸出結束標籤位 action_end 控制器結束標籤位 app_end 應用結束標籤位
也就是這些標籤位已經存在了,咱們只須要爲這些標籤位關聯指定的行爲類和方法
#4.爲系統的標籤位關聯行爲類(也叫註冊行爲類)
在每一個標籤位置,能夠配置多個行爲定義,行爲的執行順序按照定義的順序依次執行。除非前面的行爲裏面中斷執行了(某些行爲可能須要中斷執行,例如檢測機器人或者非法執行行爲),不然會繼續下一個行爲的執行。
##4.1 步驟1註冊行爲類 經過Common\Conf\tags.php配置文件定義,格式以下:
<?php return array( // 若是是3.2.1以上版本 則須要改爲 'action_begin'=>array('Home\\Behaviors\\testBehavior','Home\\Behaviors\\test1Behavior') );
##4.2步驟2 編寫行爲類,行爲類只有一個固定的方法
上面註冊了兩個行爲類,分別是Home模塊下的test和test1行爲,
類文件位於Home模塊目錄下的Behaviors目錄,能夠自定義目錄。 行爲類必須是一個包含命名空間路徑的類,如上的 Home\Behaviors\test 對應的類是
Home/Behaviors/testBehavior.class.php。 namespace Home\Behaviors; class testBehavior extends \Think\Behavior{ //行爲執行入口 public function run(&$param){ echo 11111111; } }
由於標籤位在每一個方法執行前觸發,全部執行每一個方法以前都會輸出111111,行爲的執行不會打斷方法的執行。。。
#5.自定義標籤位,並註冊行爲
除了這些系統內置標籤以外,開發人員還能夠在應用中添加本身的應用標籤。 好比在控制器的_initialize方法中:
##5.1 添加標籤
\Think\Hook::add('action_begin','Home\\Behaviors\\test1Behavior');
##5.2 行爲類的定義,
<?php namespace Home\Behaviors; class testBehavior extends \Think\Behavior{ //行爲執行入口 public function run(&$param){ } }
行爲類建議繼承\Think\Behavior,必須實現run(&$param)方法,行爲是經過這個方法執行的。
##5.3行爲的觸發: 只要在合適的地方經過如下代碼
\Think\Hook::listen('標籤名'[,參數]); // 或者 // tag('標籤名'[,參數]);
當應用執行到這個地方的時候將自動觸發指定標籤名下的全部行爲類。
注意:動態註冊的行爲必須在Hook::listen以前,即:先註冊行爲,才能觸發行爲。
listen方法能夠傳入而且只接受一個參數,若是須要傳入多個參數,請使用數組,該參數爲引用傳值,因此只能傳入變量。 參數能夠被run(&$param)中的$param接收。
##5.4自定義行爲類的時候不須要寫配置文件關聯了 (看補充8) 其實用listen和配置文件都同樣的de
#6.總結 三個東西:
咱們能夠總結出一個模式: 定義不一樣的行爲,執行同一個方法run,若是是系統的標籤須要寫配置文件關聯行爲類,自定義的行爲須要
\Think\Hook::add('king','Home\\Behaviors\\test1Behavior'); \Think\Hook::listen('king');
#7.補充:listen和tag
在方法中調用行爲 \Think\Hook::listen('標籤名'[,參數]);
在模板中調用行爲
// tag('標籤名'[,參數]);
{:tag('king')}
8補充:自定義註冊行爲的定義
<?php return array( // // 若是是3.2.1以上版本 則須要改爲 'king'=>array('Home\\Behaviors\\test1Behavior') );
寫配置文件也是能夠的額