ThinkPHP5.1 行为与钩子
文件目录
闭包方式调用钩子
\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 监听钩子
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现