thinkphp3.2行爲擴展

##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

  1. TP內置行爲鉤子 咱們知道TP中預留了一些行爲鉤子,好比 action_begin,這個鉤子是在動做開始執行時觸發。插件

  2. 預置鉤子註冊行爲類 預置的鉤子你們經過配置文件註冊行爲類,你們在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裏面改變原始變量的值。
相關文章
相關標籤/搜索