很多开发者在做二次开发时,喜欢直接去改 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)冲突。 - 返回值: 如果你的钩子是用来处理数据的(比如过滤敏感词),记得在方法里返回处理后的结果。
今日金句: 好的程序员写逻辑,顶尖的程序员写"规则"。钩子就是你为系统制定的交通规则。