GJ 站长论坛・社区规则,请知晓

赞片CMShook机制

liulian
liulian 初级会员超兽战士
发布于 2026-10-08 21:31 ·7 浏览 ·0 回复

学完这篇你能得到什么:你能在自己的赞片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

结果一般是三种情况之一:

  1. 出现 tags.php 或大量 Behavior 字样——走的是 ThinkPHP 行为(Behavior)扩展,钩子名写在 tags.php 里。
  2. 出现 addons/ 或 plugins/ 目录——走插件机制,钩子在插件自己的配置文件里声明。
  3. 只搜到零星几个词——说明这个版本钩子很弱,只能靠模板标签或自己加。

再确认一次具体文件:

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/,不动核心文件。
版权声明:本文来自 GJ站长论坛《赞片CMShook机制》
原文链接:https://www.gj0.com/thread-1202.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~