淺談PHP中的鈎子
鈎子相當於一個插件,在某些執行順序上插入進去。
行為可以在寫app接口中對所有請求執行到控制器前 執行用戶權限判斷,sign驗證等,這樣就不用在每個接口中判斷了
注意事項:
1.觸發行為的關鍵方法是Hook類中的listen方法,它通過遍歷某個行為標簽下的所有行為,依次實例化並調用run方法
2.listen方法中,如果之前在配置文件中開啟了DEBUG模式,則它會生成日志記錄你的行為,這里面牽涉到3.很多的IO操作,所以你的項目完成時建議取消DEBUG模式以提升速度
3.listen方法中,允許傳遞參數且只允許傳遞一個參數(傳多個可以用數組呢),不過這個參數是引用傳值,所以只能傳入變量,傳入常量會報錯
4.最后,Library\Think\Behavior.class.php,這個抽象類中只有一個抽象方法run(),在你的自己行為擴展中建議繼承它,盡管這不是必須的,但是這樣更加規范
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>