##1. thinkphp系統執行流程 TP在從接受到HTTP請求到最終將視圖輸出,期間經歷的不少步驟,這些步驟在在http://document.thinkphp.cn/manual_3_2.html#system_processphp
##2.行爲擴展是什麼 行爲擴展
實際上就是在這系統執行流程些流程裏埋下了一個鉤子
,你能夠往鉤子裏添加你本身的業務邏輯,當程序執行到某個鉤子位置時將自動觸發你的業務邏輯
.html
關於系統預置的一些鉤子能夠參考: http://document.thinkphp.cn/manual_3_2.html#behavior_extendthinkphp
##3.行爲和插件 在thinkphp3.2裏,有了一個插件的概念,和行爲共用一個Hook類,原理上並沒有太大區別。數組
##4. 行爲擴展篇spa
TP內置行爲鉤子 咱們知道TP中預留了一些行爲鉤子,好比 action_begin,這個鉤子是在動做開始執行時觸發。插件
預置鉤子註冊行爲類 預置的鉤子你們經過配置文件註冊行爲類,你們在Application/Common/Conf目錄下建立一個tags.php,返回一個數組,數組格式是code
"鉤子名"=>array("行爲類1","行爲類2"......)htm
demo:圖片
Application/Common/Conf/tag.php: <?php return array( "action_begin" => array("Behaviors\\test") ); ?>
能夠看到,我往action_begin這個鉤子裏面註冊了一個行爲類,這個行爲就是Behaviors\test 這裏的寫法是命名空間寫法,其對應的類文件路徑是:get
Application/Behaviors/testBehavior.class.php
注意實際類文件名須要加上Behavior後綴,以及用.class.php做爲文件擴展名。
Application/Behaviors/testBehavior.class.php:
code
<?php namespace Behaviors; class testBehavior{ function run($arg){ echo "這是一個行爲擴展".$arg; } } ?>
對於TP的自動加載機制,參考手冊: http://document.thinkphp.cn/manual_3_2.html#autoload
行爲的執行入口是 run()方法,觸發鉤子時會自動執行行爲類裏的run()方法。
##5動態添加鉤子和註冊行爲
行爲鉤子添加和註冊行爲類,以及觸發行爲,都是經過Hook類來實現的,Hook類在TP核心包裏的ThinkPHP目錄下,Hook.class.php.
>>添加鉤子以及註冊行爲:\Think\Hook::add('鉤子名','行爲') >>埋設/監聽/觸發鉤子:\Think\Hook::listen('鉤子名','傳遞給run的參數,必須是個變量');
假設咱們須要在訪問index.php/Public/login.html的時候觸發login鉤子裏的行爲,那麼首先咱們須要在login方法中監聽鉤子,也就是把鉤子埋在login方法裏,當訪問login方法時就會自動觸發,有點像獵人的陷阱不是嗎?
監聽鉤子
function login(){ \Think\Hook::listen('login');//監聽一個名爲login的鉤子 ...其餘代碼略... }
爲鉤子添加行爲
好了,咱們在login方法裏監聽了login鉤子,那麼接下來咱們往這個鉤子裏添加一些行爲,這樣訪問login的時候會自動觸發這些行爲,執行行爲類的run方法。 行爲在哪裏註冊呢?
註冊行爲
固然得在觸發以前註冊,
1.你能夠經過tags.php註冊,上面提到過了,只不過把action_begin換成login。
2.動態添加,假如你這個鉤子只在Public控制器中使用,那麼你能夠在PublicController的_initialize()初始化方法中動態添加鉤子。
function _initialize(){ \Think\Hook::add('login','Behaviors\\test'); } ``` 這裏就往login這個鉤子裏添加了一個test行爲,比較懶直接從上面複製過來了,你們理解這個意思就能夠。 添加多個行爲的話能夠這樣 ``` \Think\Hook::add('login',array('Behaviors\\test','Behaviors\\test1'...)); ``` 就是第二個參數變成一個數組,數組裏每一個元素對應一個行爲類,注意,當鉤子被觸發時,這裏面的全部行爲都會依次執行。 3.帶參數的行爲 上面咱們知道了行爲是經過run()方法執行的,那麼咱們想傳遞一些參數進去怎麼辦呢? 答案是 \Think\Hook::listen(); 的第二個參數。 注意listen方法定義以下: static public function listen($tag, &$params=NULL) 能夠看到第二個參數是一個引用傳遞的參數,也就是說,第二個參數必須是一個變量,不能是值,下面的使用方法是錯誤的: \Think\Hook::listen('login',"hello"); // x 這樣纔是正確的 $hello = "hello"; \Think\Hook::listen('login',$hello);//√ 關於引用傳遞的知識這裏不做介紹,請自行翻閱PHP手冊。 這樣咱們在行爲類裏面run方法能夠指定一個參數來接收$hello function run($arg){ echo $arg;//輸出 hello } 固然你也能夠 function run(&$arg){ echo $arg;//輸出hello $arg = "bye"; } 這樣參數設定爲引用類型,你能夠在run裏面改變原始變量的值。