迅睿 CMS 插件开发:模块钩子与事件回调的挂载方式

· 迅睿CMS · 阅读 9
摘要

迅睿的扩展方式和 Z-Blog、WP 都不太一样,它的钩子体系围绕内容模块和表单事件展开。理解这套结构,插件才写得下去。先搞清目录结构/dayrui/App/你的应用/ ├── Config/ │ ├── App.php

迅睿的扩展方式和 Z-Blog、WP 都不太一样,它的钩子体系围绕内容模块和表单事件展开。理解这套结构,插件才写得下去。

先搞清目录结构

/dayrui/App/你的应用/
├── Config/
│   ├── App.php         应用声明
│   ├── Routes.php      路由
│   └── Hooks.php       钩子挂载点
├── Controllers/        控制器
├── Models/             模型
└── Views/              视图

Config/Hooks.php 是核心,所有挂载都在这里声明。

钩子的声明方式

迅睿的钩子以数组形式返回,键是钩子名,值是回调类或闭包:

<?php
return [
    'module_content_save' => function ($data) {
        // 内容保存时触发
        return $data;
    },
];

常用的几类钩子

  • module_content_save:内容新增/编辑后
  • module_content_delete:内容删除时
  • form_post_save:表单提交后
  • member_register:会员注册时

几个实际问题

其一,钩子里拿不到模块配置。需要在应用初始化时手动加载,或者用 dr_module_cache() 取值。

其二,返回值不能省略。迅睿的部分钩子要求把入参原样返回,忘记 return 会导致后续流程拿到 null,页面直接空白。

其三,调试困难。不要用 var_dump 在钩子里打印,因为输出会混进 JSON 响应里,AJAX 请求全部解析失败。写进日志文件更稳。

上线前检查

  • 钩子回调里有没有做权限校验
  • 有没有直接拼 SQL,参数是否绑定
  • 应用被禁用时,钩子是否优雅退出