文件目录
闭包方式调用钩子
applicationpub ags.php
return [ //接口初始化 'app_init' => ['app\pub\behavior\Upfile'], ];
控制器文件: applicationpubcontrollerUpfile.php
namespace apppubcontroller;
use thinkController; use thinkfacadeHook; class Upfile extends Controller { public function index(){ // 可以不用定义行为直接把闭包函数绑定到某个标签位 Hook::add('app_init',function(){ echo '闭包调用'; }); hook::listen('app_init'); } }
行为文件:applicationpubehaviorUpfile.php
namespace apppubehavior; class Upfile { // 行为逻辑 public function run() { echo "run 入口"; } //方法名就是钩子名称的驼峰命名(首字母小写)。 public function appInit() { echo "初始化"; } }
没有 appInt() 方法时,自动调用 run() 方法。
如果存在 appInt() 方法,只调用appInt() 方法,不调用 run() 方法
闭包里的数据最后调用。
闭包传参调用
applicationpub ags.php 文件同上
控制器文件: applicationpubcontrollerUpfile.php
namespace apppubcontroller; use thinkController; use thinkfacadeHook; 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); } }
行为文件:applicationpubehaviorUpfile.php
namespace apppubehavior; class Upfile { // 行为逻辑 public function run($params) { echo "run 入口输出参数: ".$params['username']; } //方法名就是钩子名称的驼峰命名(首字母小写)。 public function appInit($params) { echo '初始化输出参数:'.$params['username']; } }
行为钩子绑定
控制器文件:applicationpubcontrollerUpfile.php
namespace apppubcontroller; use thinkController; use thinkfacadeHook; class Upfile extends Controller { public function index(){ Hook::add('app_init','app\pub\behavior\Upfile'); //手动注册行为 app_init 是注册行为的名称 后面的是行为文件路径 Hook::listen('app_init'); } }
行为文件多个用数组表示,如果其中一个行为中有中止代码的话则后续不会执行,如果返回 false 则当前标签位的后续行为将不会执行,但应用将继续运行。
行为文件:applicationpubehaviorUpfile.php
namespace apppubehavior; class Upfile { // 行为逻辑 如果没有appInit() 方法,自动执行 run() public function run() { echo "run 入口"; } //方法名就是钩子名称的驼峰命名(首字母小写)。 public function appInit() { echo '初始化'; } }
行为钩子绑定传参
控制器文件:applicationpubcontrollerUpfile.php
namespace apppubcontroller; use thinkController; use thinkfacadeHook; 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 则当前标签位的后续行为将不会执行,但应用将继续运行。
行为文件:applicationpubehaviorUpfile.php
namespace apppubehavior; class Upfile { // 行为逻辑 如果没有appInit() 方法,自动执行 run() public function run($param) { echo "run 入口:".$param['name']; } //方法名就是钩子名称的驼峰命名(首字母小写)。 public function appInit($param) { echo '初始化:'.$param['name']; } }
tage 文件统一定义行为
applicationpub ags.php
return [ //接口初始化 'app_init' => ['app\pub\behavior\Upfile'], ];
一个标签位可以绑定多个行为
控制器文件:applicationpubcontrollerUpfile.php
namespace apppubcontroller; use thinkController; use thinkfacadeHook; class Upfile extends Controller { public function index(){ $param['name']='aaa'; Hook::listen('app_init',$param); // 参数不是必选 } }
行为文件:applicationpubehaviorUpfile.php
namespace apppubehavior; 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);// 参数不是必传
行为文件:applicationpubehaviorUpfile.php
namespace apppubehavior; class Upfile { // 行为逻辑 如果没有appInit() 方法,自动执行 run() public function run($param) { echo "run 入口:".$param['name']; } //方法名就是钩子名称的驼峰命名(首字母小写)。 public function appInit($param) { echo '初始化:'.$param['name']; } }
行为变量模板赋值
控制器文件:applicationpubcontrollerUpfile.php
namespace apppubcontroller; use thinkController; use thinkfacadeHook; 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(); } }
钩子定义: applicationpub ags.php
return [
//接口初始化
'app_init' => ['app\pub\behavior\Upfile'],
];
一个标签位可以绑定多个行为
行为文件:applicationpubehaviorUpfile.php
namespace apppubehavior; class Upfile { // 行为逻辑 如果没有appInit() 方法,自动执行 run(),业务处理 public function run($param) { return "run 入口:".implode(',',$param); } //方法名就是钩子名称的驼峰命名(首字母小写),业务处理 public function appInit($param) { echo '初始化:'.implode(',',$param); } }
模板中调用钩子
控制器文件:applicationpubcontrollerUpfile.php
namespace apppubcontroller; use thinkController; use thinkfacadeHook; class Upfile extends Controller { public function index(){ return $this->fetch(); } }
行为文件:applicationpubehaviorUpfile.php
namespace apppubehavior; class Upfile { // 行为逻辑 如果没有appInit() 方法,自动执行 run(),业务处理 public function run($param) { return "run 入口:".implode(',',$param); } //方法名就是钩子名称的驼峰命名(首字母小写),业务处理 public function appInit($param) { echo '初始化:'.implode(',',$param); } }
公共函数方法: applicationcommon.php
function hook($hook,$params=array()){ hinkfacadeHook::listen($hook,$params); //监听一个钩子 }
模板中调用
{:hook('app_init', array('name'=>'AV'))}
最后总结:
-
调用行为会执行 标签名方法(方法名就是钩子名称的驼峰命名(首字母小写)),如果没有标签名的钩子方法,自动调用 run() 方法,最后处理闭包里的业务。
-
行为文件中的方法 return 返回的数据类型是数组类型
-
模板中使用 :hook,需要在公共函数文件中定义hook 监听钩子