首页
直播
壁纸
友链
搜索
1
MySQL如何解决深度分页问题?
11 阅读
2
buildadmin百度编辑器放两个只能显示一个
8 阅读
3
网站被 CC 攻击了?别慌,教你几招接地气的防护办法
7 阅读
4
thinkphp6 消息队列think-queue
6 阅读
5
microsoft store安装codex失败
5 阅读
服务器运维
后端技术
前端技术
梯子
数据库
小程序
登录
搜索
标签搜索
fastadmin
Redis
RabbitMQ
Go
服务器
codex
buildadmin
小程序
mysql
Nginx
Docker
Vue3
Node.js
MySQL优化
Linux
TypeScript
JWT
消息队列
Elasticsearch
搜索引擎
沿途的风景
累计撰写
37
篇文章
累计收到
0
条评论
首页
栏目
服务器运维
后端技术
前端技术
梯子
数据库
小程序
页面
直播
壁纸
友链
搜索到
1
篇与
» 插件开发
的结果
2026-07-24
FastAdmin 插件开发实战:从零开发自定义插件
前言FastAdmin 的插件系统是其生态的核心——通过在线安装插件,可以快速扩展论坛、CMS、商城等功能模块,无需修改框架核心代码。本文将从零开始,带你完整开发一个 FastAdmin 插件。一、插件目录结构一个标准的 FastAdmin 插件目录如下:addons/ └── mydemo/ # 插件目录(插件标识) ├── Mydemo.php # 插件主类 ├── config.php # 插件配置文件 ├── info.ini # 插件信息文件 ├── controller/ │ └── Index.php # 插件控制器 ├── model/ │ └── Demo.php # 插件模型 ├── view/ │ └── index/ │ └── index.html # 插件视图 ├── public/ │ ├── css/ │ │ └── mydemo.css # 插件样式 │ └── js/ │ └── mydemo.js # 插件脚本 └── hooks.php # 钩子定义(可选)二、创建插件2.1 使用命令行创建php think addon -a mydemo -c create这会在 addons/mydemo/ 目录下自动生成插件骨架文件。2.2 info.ini 插件信息name = mydemo title = 示例插件 description = 这是一个 FastAdmin 示例插件 author = Your Name version = 1.0.0 state = 1字段说明name插件标识(目录名,全小写)title插件名称description插件描述author作者version版本号state状态:1=正常,0=禁用2.3 插件主类 Mydemo.php<?php namespace addons\mydemo; use think\Addons; class Mydemo extends Addons { // 插件安装时执行 public function install() { // 创建数据表 $sql = "CREATE TABLE IF NOT EXISTS `fa_mydemo` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(100) NOT NULL DEFAULT '', `content` text, `createtime` int(10) unsigned NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"; \think\Db::execute($sql); return true; } // 插件卸载时执行 public function uninstall() { // 删除数据表 \think\Db::execute("DROP TABLE IF EXISTS `fa_mydemo`"); return true; } // 插件启用时执行 public function enable() { return true; } // 插件禁用时执行 public function disable() { return true; } // 钩子:在后台首页显示 public function adminIndexTop($params) { echo '<div class="alert alert-info">欢迎使用 Mydemo 插件!</div>'; } }2.4 config.php 插件配置<?php return [ [ 'name' => 'title', 'title' => '插件标题', 'type' => 'text', 'content' => '', 'value' => 'Mydemo Plugin', 'rule' => 'required', 'msg' => '请填写插件标题', 'tip' => '显示在插件管理页面的标题', ], [ 'name' => 'display_count', 'title' => '显示数量', 'type' => 'number', 'content' => '', 'value' => '10', 'rule' => 'required', 'msg' => '请填写显示数量', 'tip' => '前台显示的数据条数', ], [ 'name' => 'is_open', 'title' => '是否开启', 'type' => 'radio', 'content' => ['0' => '关闭', '1' => '开启'], 'value' => '1', 'rule' => 'required', 'msg' => '', 'tip' => '', ], ];配置在后台 → 插件管理 → 配置 中可编辑,读取方式:$config = get_addon_config('mydemo'); $title = $config['title'];三、插件控制器3.1 后台控制器<?php // addons/mydemo/controller/Index.php namespace addons\mydemo\controller; use app\common\controller\Backend; use think\Db; class Index extends Backend { // 不需要登录的方法 protected $noNeedLogin = []; // 不需要权限验证的方法 protected $noNeedRight = []; /** * 插件后台首页 */ public function index() { $list = Db::name('mydemo')->order('id', 'desc')->paginate(15); $this->view->assign('list', $list); return $this->view->fetch(); } /** * 添加数据 */ public function add() { if ($this->request->isPost()) { $data = $this->request->post('row/a'); $data['createtime'] = time(); Db::name('mydemo')->insert($data); $this->success('添加成功'); } return $this->view->fetch(); } /** * 删除数据 */ public function del($ids = null) { Db::name('mydemo')->where('id', 'in', $ids)->delete(); $this->success('删除成功'); } }3.2 访问路由插件控制器的 URL 格式为:http://yourdomain.com/addons/mydemo/index/index对应:addons - 固定前缀mydemo - 插件标识index - 控制器名index - 方法名3.3 前台控制器<?php // addons/mydemo/controller/Api.php namespace addons\mydemo\controller; use app\common\controller\Api; class Api extends Api { // 不需要登录的方法 protected $noNeedLogin = ['getList']; /** * 获取数据列表(API 接口) */ public function getList() { $count = \think\Db::name('mydemo')->count(); $list = \think\Db::name('mydemo') ->order('id', 'desc') ->limit(10) ->select(); $this->success('获取成功', [ 'total' => $count, 'list' => $list, ]); } }四、钩子机制(Hook)4.1 注册钩子在插件主类中定义钩子方法,方法名即钩子名:// addons/mydemo/Mydemo.php class Mydemo extends Addons { // 钩子:文章详情页底部 public function articleDetailBottom($params) { // $params 是传递的参数 $article = $params['article']; // 输出自定义内容 echo '<div class="mydemo-box">'; echo '<h3>相关推荐</h3>'; echo '</div>'; } // 钩子:后台导航栏 public function adminSidebar($params) { echo '<li><a href="' . addon_url('mydemo/index/index') . '">'; echo '<i class="fa fa-puzzle-piece"></i> <span>Mydemo</span>'; echo '</a></li>'; } }4.2 触发钩子在任意位置触发钩子:// 传递参数给钩子 \think\Hook::listen('article_detail_bottom', ['article' => $article]);4.3 FastAdmin 内置常用钩子钩子名触发位置参数admin_index_top后台首页顶部无admin_sidebar后台左侧菜单无article_detail_bottom文章详情底部article 数据user_register_after用户注册后user 数据config_init配置初始化配置数组五、插件打包发布5.1 打包# 将插件目录打包为 zip cd addons zip -r mydemo.zip mydemo/注意:打包时不要包含 runtime、temp 等临时目录。5.2 发布到插件市场注册 FastAdmin 官网账号进入"开发者中心"点击"发布插件"上传 zip 包,填写插件信息等待审核通过5.3 版本更新更新 info.ini 中的版本号后重新打包上传,用户可在后台一键升级。六、调试技巧6.1 开启插件调试// application/config.php 'app_debug' => true; // 确保插件目录有读写权限 chmod -R 755 addons/mydemo/6.2 查看插件日志// 在插件代码中记录日志 \think\Log::info('Mydemo: ' . json_encode($data)); // 查看日志 // runtime/log/202607/24.log6.3 热更新开发阶段修改插件代码后,清除缓存即可生效:php think clear --type=cache php think clear --type=temp七、完整插件开发流程1. php think addon -a mydemo -c create → 创建骨架 2. 编辑 info.ini → 填写插件信息 3. 编辑 Mydemo.php → 实现安装/卸载/钩子 4. 编辑 config.php → 定义插件配置项 5. 编写 controller/ → 实现业务逻辑 6. 编写 view/ → 编写视图模板 7. 编写 public/ → 添加前端资源 8. 后台安装插件 → 测试 → 调试 9. 打包 zip → 发布总结FastAdmin 插件系统通过目录约定 + 钩子机制实现了松耦合的功能扩展。核心要点:插件主类继承 think\Addons,实现 install/uninstall 生命周期通过 config.php 定义可视化配置项通过 Hook::listen() 在框架任意位置触发钩子插件可以有自己的 MVC 结构,独立于主应用
2026年07月24日
1 阅读
0 评论
0 点赞
0:00