Bludit CMS最常用的钩子和内置函数

12月 21, 2025 - 阅读需时: 13 分钟

你想要梳理 Bludit CMS 开发中最常用的钩子(Hooks)和内置函数,这是扩展 Bludit 功能的核心基础。下面我会按「钩子」「核心函数」两大模块,分类整理高频使用的内容,并附上实用示例,方便你直接复用。

一、最常用的钩子(Hooks)

Bludit 的钩子是「事件触发点」,能在不修改核心代码的前提下拦截/扩展系统行为。以下按「使用场景」分类,列出开发中 80% 场景会用到的钩子:

1. 内容生命周期钩子(文章/页面)

钩子名称 触发时机 核心参数 典型用途
beforePageCreate 创建文章/页面 $args['data'](提交的表单数据) 内容校验、自动补全字段(如摘要)
afterPageCreate 创建文章/页面 $args['page'](页面对象) 同步内容到第三方平台、记录日志
beforePageSave 保存文章/页面 $args['page'](页面对象) 过滤敏感内容、自动计算阅读时长
afterPageSave 保存文章/页面 $args['page'](页面对象) 更新缓存、推送站内通知
beforePageDelete 删除文章/页面 $args['pageKey'](页面唯一标识) 备份待删除内容、校验删除权限

示例:保存文章时自动生成摘要

public function init() {
    $this->addHook('beforePageSave', 'autoGenerateExcerpt');
}

public function autoGenerateExcerpt($args) {
    $page = $args['page'];
    // 如果用户未填写摘要,自动从内容截取150字
    if (empty($page->excerpt())) {
        $content = strip_tags($page->content()); // 去除HTML标签
        $excerpt = mb_substr($content, 0, 150, 'UTF-8') . '...';
        $page->setExcerpt($excerpt);
    }
}

2. 页面渲染钩子(前端/后台)

钩子名称 触发时机 核心参数 典型用途
beforeRender 所有页面渲染 $args['where'](渲染位置:front/admin)、$args['content'](待渲染内容) 注入全局变量、SEO 优化(加关键词)
afterRender 所有页面渲染 $args['content'](渲染后的HTML) 替换内容、添加统计代码(如百度统计)
adminHead 后台页面 <head> 渲染时 无(直接输出HTML) 加载自定义CSS/JS(如新增后台按钮样式)
siteHead 前端页面 <head> 渲染时 无(直接输出HTML) 加载前端样式、引入CDN资源
afterPageRender 单篇文章/页面渲染 $args['content'](页面HTML) 添加版权信息、相关文章推荐

示例:前端页面底部添加统计代码

public function init() {
    $this->addHook('afterRender', 'addAnalytics');
}

public function addAnalytics($args) {
    // 仅在前端页面生效
    if ($args['where'] == 'front') {
        $analyticsCode = '<script src="https://hm.baidu.com/hm.js?你的ID"></script>';
        $args['content'] = str_replace('</body>', $analyticsCode . '</body>', $args['content']);
    }
    return $args;
}

3. 用户操作钩子

钩子名称 触发时机 核心参数 典型用途
loginSuccess 用户登录成功 $args['username'](用户名) 记录登录日志、多租户验证
loginFailure 用户登录失败 $args['username'](用户名) 防暴力破解(限制登录次数)
afterUserCreate 创建用户 $args['user'](用户对象) 发送欢迎邮件、初始化用户权限

4. 系统初始化钩子

钩子名称 触发时机 核心参数 典型用途
init 插件初始化时(替代类的init方法) 注册路由、初始化配置
routerBefore 路由解析 $args['uri'](当前访问URI) 自定义路由、URL重写

二、最常用的内置函数/对象方法

Bludit 提供了丰富的内置对象和方法,用于快速获取/操作数据,以下按「数据类型」分类整理高频用法:

1. 站点全局信息($site 对象)

方法 作用 示例
$site->title() 获取站点标题 echo $site->title(); // 输出博客名称
$site->description() 获取站点描述 用于SEO元标签
$site->url() 获取站点根URL echo $site->url() . '/about'; // 拼接关于页URL
$site->language() 获取站点语言 if ($site->language() == 'zh') { ... }
$site->custom($key) 获取站点自定义字段 $site->custom('phone'); // 获取站点联系电话

2. 文章/页面操作($page/$posts 对象)

(1)单篇文章/页面($page 对象)

方法 作用 示例
$page->title() 获取标题
$page->content() 获取完整内容
$page->excerpt($length) 获取摘要(指定长度) $page->excerpt(200); // 200字摘要
$page->permalink() 获取永久链接
$page->date($format) 获取发布时间(自定义格式) $page->date('Y-m-d H:i');
$page->category() 获取分类名称
$page->tags() 获取标签数组 foreach($page->tags() as $tag) { ... }
$page->custom($key) 获取自定义字段 $page->custom('readingTime'); // 阅读时长
$page->setCustom($key, $value) 设置自定义字段 插件中保存自定义数据

(2)文章列表(Posts 类)

方法 作用 示例
Posts::getList($page, $amount, $orderBy) 获取文章列表 $posts = Posts::getList(0, 10, 'date'); // 最新10篇
Posts::getByCategory($category) 按分类筛选 $posts = Posts::getByCategory('技术');
Posts::count() 获取总文章数

3. 用户操作($user/Users 类)

方法 作用 示例
$user->username() 获取当前登录用户名
$user->role() 获取用户角色(admin/editor) if ($user->role() == 'admin') { ... }
Users::get($username) 获取指定用户对象

4. 工具类函数

函数 作用 示例
sanitize($string) 过滤XSS、特殊字符 $safeStr = sanitize($_POST['content']);
permalink($string) 生成URL友好的字符串 $slug = permalink('Bludit CMS教程'); // bludit-cms教程
json_encode_pretty($data) 格式化JSON输出 保存配置文件时使用
buildHTTPQuery($params) 拼接URL参数 $url = $site->url() . '?' . buildHTTPQuery(['page' => 1]);

5. 自定义路由(插件中)

// 注册路由:https://你的站点.com/api/posts
public function init() {
    $this->addRoute('api/posts', 'handleApiPosts');
}

// 处理路由请求
public function handleApiPosts() {
    header('Content-Type: application/json');
    $posts = Posts::getList(0, 10);
    $data = [];
    foreach ($posts as $post) {
        $data[] = [
            'title' => $post->title(),
            'url' => $post->permalink()
        ];
    }
    echo json_encode($data, JSON_UNESCAPED_UNICODE);
    exit; // 终止默认渲染
}

总结

核心钩子关键点

  1. 内容相关逻辑优先用 before/afterPageSave,能覆盖大部分文章/页面定制需求;
  2. 前端样式/脚本注入用 siteHead/afterRender,后台定制用 adminHead
  3. 用户权限/登录控制用 loginSuccess/loginFailure

核心函数关键点

  1. 获取/设置数据优先用内置对象($site/$page/$user),避免直接操作文件;
  2. 用户输入必须用 sanitize() 过滤,防止XSS漏洞;
  3. 插件中自定义API/路由用 addRoute(),是扩展Bludit接口能力的核心方式。

如果需要针对某个具体场景(比如开发评论插件、实现内容搜索)的钩子+函数组合示例,我可以补充完整代码。