thinkphp5 行為(鈎子)擴展


行為整理鏈接

淺談PHP中的鈎子

鈎子相當於一個插件,在某些執行順序上插入進去。

行為可以在寫app接口中對所有請求執行到控制器前 執行用戶權限判斷,sign驗證等,這樣就不用在每個接口中判斷了

注意事項
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模塊為例)

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

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

home模塊下建tags.php文件將行為綁定綁定(注冊)到app_init和zzzzz標簽上

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

控制器方法內需要的地方偵聽行為(比如在隨便某個控制器的index方法中添加)

$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);        //監聽一個鈎子
}

 

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM