赞片CMShook机制
学完这篇你能得到什么:你能在自己的赞片CMS里找到钩子(hook)到底挂在哪、怎么注册一个新钩子、怎么写处理函数,从而在不改动核心文件的前提下往页面或控制器里插入自己的逻辑。
赞片CMS 是基于 ThinkPHP 的影视站系统,不同版本(2.x、3.x 以及各种二次开发版)钩子的实现差异很大,所以下面不背 API,而是教你一套「先定位、再挂载、后验证」的做法,换版本也照样能用。
第一步:确认版本和站点根目录
这一步要拿到版本号,知道代码放在哪,后面所有搜索都在这个目录里做。登录后台,首页底部或「系统」→「系统信息」里能看到版本号;也可以在服务器上执行:
cd /www/wwwroot/你的域名
cat data/conf/version.php 2>/dev/null || cat application/version.php 2>/dev/null
ls
根目录下正常会看到 application/、template/、data/、runtime/、public/ 这几个文件夹。记下完整绝对路径,后面命令里的 /www/wwwroot/你的域名 都替换成它。
注意:宝塔面板默认站点路径是
/www/wwwroot/域名,但有人会把public设为运行目录,此时根目录是站点目录的上一层,别搜错位置。
第二步:搜出钩子到底存在于哪一层
这一步要判断你的版本用的是哪种钩子机制,得到一张「钩子地图」。在站点根目录执行:
grep -rniE "hook|addons|behavior" application/ --include=*.php -l | head -30
结果一般是三种情况之一:
- 出现
tags.php或大量Behavior字样——走的是 ThinkPHP 行为(Behavior)扩展,钩子名写在tags.php里。 - 出现
addons/或plugins/目录——走插件机制,钩子在插件自己的配置文件里声明。 - 只搜到零星几个词——说明这个版本钩子很弱,只能靠模板标签或自己加。
再确认一次具体文件:
find . -name "tags.php" -not -path "*/runtime/*"
把找到的文件用 cat 打开,里面的键(比如 view_filter、admin_init 这类名字)就是可用的钩子名。你的版本叫什么名字,以你搜出来的为准,不要照抄别人的。
第三步:注册一个新钩子
这一步把你自己写的处理类挂到钩子上,得到一个会被系统自动调用的入口。假设你在 tags.php 里看到钩子名是 view_filter,把它改成:
<?php
return [
'view_filter' => [
'Addons\\Demo\\Behavior\\DemoBehavior',
],
];
如果tags.php 里已经有内容,只在对应数组里追加一行,不要整个覆盖。
注意:ThinkPHP 在 Linux 下大小写敏感,命名空间
Addons\Demo\Behavior\DemoBehavior必须和实际目录addons/Demo/Behavior/DemoBehavior.php严格对应,少一个大写就报「类不存在」。
第四步:写处理函数本体
这一步写出真正干活的代码。新建 addons/Demo/Behavior/DemoBehavior.php:
<?php
namespace Addons\Demo\Behavior;
class DemoBehavior
{
public function run(&$params)
{
if (!isset($params['content'])) {
return;
}
$params['content'] = str_replace(
'</body>',
'<script src="/static/demo.js"></script></body>',
$params['content']
);
}
}
关键点是 &$params 必须带 & 引用符,改它才会影响最终输出;第二个参数名要和系统调用时传的一致(在第二步搜到的调用处能看到)。
第五步:触发并验证
这一步确认钩子真的生效。先清缓存:
rm -rf runtime/*
后台「系统」→「缓存管理」→点击「清除缓存」也可以。然后刷新前台任意页面,查看网页源码,看 demo.js 是否出现在 </body> 前面。没生效就去 runtime/log/ 下找当天的 .log 文件,里面会写类加载失败的具体原因。
注意:改完
tags.php或新增类文件后不清缓存,PHP 可能仍在跑旧的编译结果,这一步别省。
第六步:上线前的三条纪律
- 所有自定义代码放在
addons/或extend/里,不碰application/下的核心文件,否则系统升级会直接覆盖掉你的改动。 - 升级前把
tags.php和自定义目录一起备份,升级后重新比对合并。 - 钩子处理函数里不要做数据库查询或远程请求,它在每次请求都会执行,写重了整站会变慢。
小结
- 赞片CMS 不同版本钩子实现不同,第一步永远是
grep定位,而不是照抄网上的钩子名。 - 三类入口:模板标签、ThinkPHP 的
tags.php行为、addons/插件机制。 - 注册靠改
tags.php追加类名,实现靠带&的处理函数。 - 命名空间和目录大小写必须完全一致。
- 改完必须清
runtime缓存,报错看runtime/log/。 - 自定义代码全部隔离在
addons/,不动核心文件。
原文链接:https://www.gj0.com/thread-1202.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。