thinkphp5 行爲(鉤子)擴展

行爲整理連接php

淺談PHP中的鉤子

鉤子至關於一個插件,在某些執行順序上插入進去。html

行爲能夠在寫app接口中對全部請求執行到控制器前 執行用戶權限判斷,sign驗證等,這樣就不用在每一個接口中判斷了thinkphp

注意事項
1.觸發行爲的關鍵方法是Hook類中的listen方法,它經過遍歷某個行爲標籤下的全部行爲,依次實例化並調用run方法
2.listen方法中,若是以前在配置文件中開啓了DEBUG模式,則它會生成日誌記錄你的行爲,這裏面牽涉到3.不少的IO操做,因此你的項目完成時建議取消DEBUG模式以提高速度
3.listen方法中,容許傳遞參數且只容許傳遞一個參數(傳多個能夠用數組呢),不過這個參數是引用傳值,因此只能傳入變量,傳入常量會報錯
4.最後,Library\Think\Behavior.class.php,這個抽象類中只有一個抽象方法run(),在你的本身行爲擴展中建議繼承它,儘管這不是必須的,可是這樣更加規範
listen()---->加載註冊的標籤(如targs.php裏的)------->遍歷註冊標籤的鍵取出值,而且依次實例化標籤鍵的值存放的類--->執行run方法:
 

例子:數組

在應用或模塊下建 behavior目錄,目錄內建行爲類文件Test.php(如下以home模塊爲例)app

namespace app\home\behavior;//注意應用或模塊的不一樣命名空間
class Test {
    public function run(&$params){
        echo $params;
    }
}

行爲定義完成後,就須要綁定到某個標籤位置才能生效,不然是不會執行的函數

home模塊下建tags.php文件將行爲綁定綁定(註冊)到app_init和zzzzz標籤上this

return [
    'app_init'=> [
        'app\\home\\behavior\\Test', //注意行爲的命名空間(下同)
    ],
    'zzzzz'=> [//自定義標籤位
        'app\\home\\behavior\\Test',
    ],
    //.................
];

控制器方法內須要的地方偵聽行爲(好比在隨便某個控制器的index方法中添加)spa

$params='ok';
\think\Hook::listen('app_init',$params);//參數爲變量(下同) \think\Hook::listen('zzzzz',$params);//自定義

訪問這個index方法  輸出  okok插件

 

例子2:好比咱們想在首頁加載廣告:日誌

1.在控制器中 Application->Home->Controller->IndexController.class.php

namespace Home\Controller;
use Think\Controller;
use Think\Hook;//引用Hook
class IndexController extends Controller {
    public function index(){
        //手動註冊行爲 ad 是註冊行爲的名稱 後面的是路徑 接下來會說如何新建路徑中的文件(也能夠在targs.php中配置自動註冊)
        Hook::add('ad','Behavior\\adBehavior');
        //觸發行爲 (這種是在控制器中觸發行爲,還有在html頁面中觸發行爲的 接下來就會看到) $parnam 爲想要帶的參數 能夠隨便定義  
        //hook::listen('ad',$parnam);//咱們不要在這觸發而是在html模板上觸發的話請註釋這句
$this->display(); } }

在應用或模塊下建 behavior目錄,目錄內建行爲類文件Test.php(如下以home模塊爲例)

namespace app\home\behavior;//注意應用或模塊的不一樣命名空間
class Test {
    public function run(&$params){
         //$arg爲帶過來的參數 能夠在其中寫入本身的業務邏輯 行爲必須執行run 
            echo '我是一條'.$params['name'].'廣告,'.$params['value'].'代言';       
            //在此介紹下,run必須的 ,細心的會在Think核心找到Behavior.class.php裏面有這樣一句操蛋的話  abstract public function run(&$params); 你懂的
    }
}

 

公共函數文件封裝下觸發行爲的方法:

function hooklisten($hook,$params=array()){
    \Think\Hook::listen($hook,$params);        //監聽一個鉤子
}

 

四、在模板中使用 Application->Home->View->Index->index.html 添加以下代碼:

<body>
    <h1>How to used?</h1>
    {:hooklisten('ad', array('name'=>'AV','value'=>'*老師'))} //這個呢就是在頁面中觸發行爲的方式了
</body>
相關文章
相關標籤/搜索