文件目錄
閉包方式調用鉤子
\application\pub\tags.php
return [ //接口初始化 'app_init' => ['app\\pub\\behavior\\Upfile'], ];
控制器文件: \application\pub\controller\Upfile.php
namespace app\pub\controller;
use think\Controller; use think\facade\Hook; class Upfile extends Controller { public function index(){ // 可以不用定義行爲直接把閉包函數綁定到某個標籤位 Hook::add('app_init',function(){ echo '閉包調用'; }); hook::listen('app_init'); } }
行爲文件:\application\pub\behavior\Upfile.php
namespace app\pub\behavior; class Upfile { // 行爲邏輯 public function run() { echo "run 入口"; } //方法名就是鉤子名稱的駝峯命名(首字母小寫)。 public function appInit() { echo "初始化"; } }
沒有 appInt() 方法時,自動調用 run() 方法。
如果存在 appInt() 方法,只調用appInt() 方法,不調用 run() 方法
閉包裏的數據最後調用。
閉包傳參調用
\application\pub\tags.php 文件同上
控制器文件: \application\pub\controller\Upfile.php
namespace app\pub\controller; use think\Controller; use think\facade\Hook; class Upfile extends Controller { public function index(){ $params = ['username' => 'liaosp']; Hook::add('app_init',function($params){ echo "<br/>".' 閉包輸出參數:'.$params['username']; }); Hook::listen('app_init',$params); } }
行爲文件:\application\pub\behavior\Upfile.php
namespace app\pub\behavior; class Upfile { // 行爲邏輯 public function run($params) { echo "run 入口輸出參數: ".$params['username']; } //方法名就是鉤子名稱的駝峯命名(首字母小寫)。 public function appInit($params) { echo '初始化輸出參數:'.$params['username']; } }
行爲鉤子綁定
控制器文件:\application\pub\controller\Upfile.php
namespace app\pub\controller; use think\Controller; use think\facade\Hook; class Upfile extends Controller { public function index(){ Hook::add('app_init','app\\pub\\behavior\\Upfile'); //手動註冊行爲 app_init 是註冊行爲的名稱 後面的是行爲文件路徑 Hook::listen('app_init'); } }
行爲文件多個用數組表示,如果其中一個行爲中有中止代碼的話則後續不會執行,如果返回 false 則當前標籤位的後續行爲將不會執行,但應用將繼續運行。
行爲文件:\application\pub\behavior\Upfile.php
namespace app\pub\behavior; class Upfile { // 行爲邏輯 如果沒有appInit() 方法,自動執行 run() public function run() { echo "run 入口"; } //方法名就是鉤子名稱的駝峯命名(首字母小寫)。 public function appInit() { echo '初始化'; } }
行爲鉤子綁定傳參
控制器文件:\application\pub\controller\Upfile.php
namespace app\pub\controller; use think\Controller; use think\facade\Hook; class Upfile extends Controller { public function index(){ Hook::add('app_init','app\\pub\\behavior\\Upfile'); //手動註冊行爲 app_init 是註冊行爲的名稱 後面的是路徑 $param['name']='aaa'; Hook::listen('app_init',$param); } }
行爲文件多個用數組表示,如果其中一個行爲中有中止代碼的話則後續不會執行,如果返回 false 則當前標籤位的後續行爲將不會執行,但應用將繼續運行。
行爲文件:\application\pub\behavior\Upfile.php
namespace app\pub\behavior; class Upfile { // 行爲邏輯 如果沒有appInit() 方法,自動執行 run() public function run($param) { echo "run 入口:".$param['name']; } //方法名就是鉤子名稱的駝峯命名(首字母小寫)。 public function appInit($param) { echo '初始化:'.$param['name']; } }
tage 文件統一定義行爲
\application\pub\tags.php
return [ //接口初始化 'app_init' => ['app\\pub\\behavior\\Upfile'], ];
一個標籤位可以綁定多個行爲
控制器文件:\application\pub\controller\Upfile.php
namespace app\pub\controller; use think\Controller; use think\facade\Hook; class Upfile extends Controller { public function index(){ $param['name']='aaa'; Hook::listen('app_init',$param); // 參數不是必選 } }
行爲文件:\application\pub\behavior\Upfile.php
namespace app\pub\behavior; class Upfile { // 行爲邏輯 如果沒有appInit() 方法,自動執行 run() public function run($param) { echo "run 入口:".$param['name']; } //方法名就是鉤子名稱的駝峯命名(首字母小寫)。 public function appInit($param) { echo '初始化:'.$param['name']; } }
直接執行行爲
直接執行行爲的時候,執行的是run方法
$param['name']='aaa'; Hook::exec('app\\pub\\behavior\\Upfile',$param);// 參數不是必傳
如果需要執行行爲類的其它方法,可以使用
$param['name']='aaa'; Hook::exec(['app\\pub\\behavior\\Upfile','appInit'], $param);// 參數不是必傳
行爲文件:\application\pub\behavior\Upfile.php
namespace app\pub\behavior; class Upfile { // 行爲邏輯 如果沒有appInit() 方法,自動執行 run() public function run($param) { echo "run 入口:".$param['name']; } //方法名就是鉤子名稱的駝峯命名(首字母小寫)。 public function appInit($param) { echo '初始化:'.$param['name']; } }
行爲變量模板賦值
控制器文件:\application\pub\controller\Upfile.php
namespace app\pub\controller; use think\Controller; use think\facade\Hook; class Upfile extends Controller { public function index(){ $param=array("red","green","blue","yellow","brown"); $result=Hook::listen('app_init',$param);// 返回數據類型爲數組類型 $this->assign('hook',$result[0]); // 變量傳遞,模板中調用{$hook} return $this->fetch(); } }
鉤子定義: \application\pub\tags.php
return [
//接口初始化
'app_init' => ['app\\pub\\behavior\\Upfile'],
];
一個標籤位可以綁定多個行爲
行爲文件:\application\pub\behavior\Upfile.php
namespace app\pub\behavior; class Upfile { // 行爲邏輯 如果沒有appInit() 方法,自動執行 run(),業務處理 public function run($param) { return "run 入口:".implode(',',$param); } //方法名就是鉤子名稱的駝峯命名(首字母小寫),業務處理 public function appInit($param) { echo '初始化:'.implode(',',$param); } }
模板中調用鉤子
控制器文件:\application\pub\controller\Upfile.php
namespace app\pub\controller; use think\Controller; use think\facade\Hook; class Upfile extends Controller { public function index(){ return $this->fetch(); } }
行爲文件:\application\pub\behavior\Upfile.php
namespace app\pub\behavior; class Upfile { // 行爲邏輯 如果沒有appInit() 方法,自動執行 run(),業務處理 public function run($param) { return "run 入口:".implode(',',$param); } //方法名就是鉤子名稱的駝峯命名(首字母小寫),業務處理 public function appInit($param) { echo '初始化:'.implode(',',$param); } }
公共函數方法: \application\common.php
function hook($hook,$params=array()){ \think\facade\Hook::listen($hook,$params); //監聽一個鉤子 }
模板中調用
{:hook('app_init', array('name'=>'AV'))}
最後總結:
-
調用行爲會執行 標籤名方法(方法名就是鉤子名稱的駝峯命名(首字母小寫)),如果沒有標籤名的鉤子方法,自動調用 run() 方法,最後處理閉包裏的業務。
-
行爲文件中的方法 return 返回的數據類型是數組類型
-
模板中使用 :hook,需要在公共函數文件中定義hook 監聽鉤子