ThinkPHP钩子技巧:零侵入二次开发

很多开发者在做二次开发时,喜欢直接去改 api 目录或者 app 目录下的核心控制器代码。这样做的后果就是:一旦框架升级,你的改动全会被覆盖,瞬间回到解放前。


📅 今日知识点:优雅地使用钩子(Hook)实现功能解耦

核心逻辑:

钩子(Hook)就像是在代码执行流程中预留的"插座"。你可以通过插件(Plugin)在这些插座上插上你的"电器"(功能代码),而不需要拆开墙壁去改线路。

1. 如何"埋下"一个钩子?

如果你正在写一个自定义模块,希望别人也能在这个模块执行时加入逻辑,你只需要在代码里写这一行:

php 复制代码
// 参数1:钩子名称(自定义)
// 参数2:传递给钩子的参数(可以是变量、数组或对象)
hook('user_after_login', $user);
2. 如何"挂载"逻辑到钩子?

在 ThinkCMF 的插件开发中,你只需要在插件的主类(例如 YourPlugin.php)中编写对应的方法:

php 复制代码
// 方法名规则:钩子名称驼峰化
public function userAfterLogin($param) {
    // 这里写你的逻辑,比如登录后发个短信提醒
    $user = $param;
    \think\facade\Log::info("用户 " . $user['user_nickname'] . " 刚刚登录了!");
}

💡 为什么老司机都爱它?

维度 直接改源码 使用钩子(Hook)
代码侵入性 极高,破坏核心逻辑 零侵入,插件化
升级友好度 噩梦级,无法平滑升级 极佳,核心代码随便更
维护性 逻辑散落在各处,难找 集中在插件中,清晰明了
可复用性 很难迁移到其他项目 插件一打包,到处都能用

⚠️ 注意事项

  • 钩子名称: 尽量唯一,避免和系统自带的钩子(如 admin_init, footer_start)冲突。
  • 返回值: 如果你的钩子是用来处理数据的(比如过滤敏感词),记得在方法里返回处理后的结果。

今日金句: 好的程序员写逻辑,顶尖的程序员写"规则"。钩子就是你为系统制定的交通规则。