FastAdmin二次开发需遵循四大核心约定:控制器必须继承app\admin\controller\Admin,模型用访问器+追加属性而非改库,表格JS配置在Controller.initTable()中调整,业务逻辑通过插件事件解耦。
FastAdmin 不仅适合二次开发,而且是 PHP 后台框架中为数不多把“可二次开发性”设计进骨架里的成熟方案——前提是别把它当黑盒用,得摸清它的约定和钩子位置。
app\admin\controller\Admin
很多新手直接新建控制器不继承基类,结果权限校验失效、$this->auth 为空、JS 初始化失败。FastAdmin 的后台逻辑(如菜单权限、数据范围过滤、登录态保持)全依赖这个父类的 initialize() 和中间件链。
\app\admin\controller\Admin,不是 think\Controller 或空类application/admin/library/traits/Backend.php 中的 index(),再修改,否则会丢失分页、搜索、多选等默认行为/** @permission 订单导出,export */,否则在角色配置页看不到该权限项比如商品表没「屏幕供应商」字段,但规格数据存在 JSON 字段 spec_rel 里——这时不该 ALTER TABLE 加字段,而该在模型里用 $append + getXXXAttr 动态计算:
protected $append = ['screen_supplier'];public function getScreenSupplierAttr($value, $data) { return $data['spec_rel'][0]['value'] ?? '未知'; }
这样前端模板直接用 {$row.screen_supplier},不用改数据库、不污染原始结构,升级时也不冲突。
Db::name('goods')->where(...)->find() 这类硬查询,破坏 ORM 封装和缓存机制$validate 属性或 validate() 方法,别在控制器里手写 if 判断createtime)建议用 $autoWriteTimestamp = true,而非手动赋值table.js 里想禁用 Excel 导出?不是删 HTML 按钮,而是改 JS 初始化里的 showexport: false;想隐藏列切换按钮?设 showcolumns: false。这些都在 public/assets/js/backend/xxx.js 的 Controller.initTable() 调用中。
bootstrapTable 驱动,参数名大小写敏感(如 showToggle ≠ showtoggle)id,要扩展成多字段,得改 searchFields 参数,比如 searchFields: 'title,category_id,status'
checkboxHeader)默认关闭,开启后记得同步后端 multi 方法支持批量操作逻辑application/admin 下的核心文件订单状态变更要触发供应商备货?别在 Order.php 控制器里写业务逻辑,而是挂事件钩子:
public function onOrderStatusChange($order)
{
if ($order->order_status == 3 && $order->pay_status == 1) {
hook('supplier_prepare_stock', $order);
}
}然后在插件目录(addons/supplier/)里监听这个事件。升级 FastAdmin 时,核心代码一覆盖就丢功能;插件目录不动,逻辑就稳。
Auth::instance()->check('rule') ,别靠 session 变量硬判断真正卡住二次开发进度的,从来不是功能写不出来,而是没意识到 FastAdmin 的“约定大于配置”有多强——它不拦你自由发挥,但一旦偏离路径,就会在权限、分页、导出、搜索这些看似琐碎的地方反复报错。把控制器继承、模型访问器、JS 表格参数、插件事件这四条线理顺,剩下的就是填业务了。
# php
# excel
# html
# js
# 前端
# bootstrap
# json
# go
# windows
# app
# session
# 架构
# 中间件
# if
# 封装
# 父类
# require
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
如何在Golang中实现邮件发送功能_Golang SMTP发送与错误处理示例
Linux如何安装Golang环境_Linux下Go语言开发包配置【方法】
Python随机数生成_random模块说明【指导】
如何在Golang中处理URL参数_Golang URL参数解析与路由映射方法
Windows10如何更改盘符名称_Win10重命名硬盘分区卷标
如何解决Windows字体显示模糊的问题?(ClearType设置)
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
如何解决Windows时间不准的问题?(自动同步设置)
Win11如何关闭游戏模式 Win11禁用Xbox Game Bar录制【优化】
如何使用Golang reflect检查方法数量_动态分析类型方法
Win11怎么设置ipv4地址_Windows 11固定静态IP地址配置教程【详解】
PythonPandas数据分析项目教程_时间序列透视表应用
ACF 教程:正确更新嵌套在多层 Group 字段内的子字段
Win10怎么限制单程序CPU占用上限_Win10任务管理器亲和性或第三方工具均衡负载【技巧】
Win11怎么退出高对比度模式_Win11取消反色显示快捷键【修复】
Win10怎么卸载迅雷_Win10彻底卸载迅雷方法【步骤】
Win10怎样清理C盘浏览器缓存_Win10清理浏览器缓存步骤【步骤】
Win11怎么用设置清理回收站_Win11设置清理回收站技巧【步骤】
本地php环境打开php文件直接下载_浏览器解析php为下载的修复方法【解答】
如何在JavaScript中动态拼接PHP的base_url与jQuery变量
如何使用Golang实现文件加密_Golang crypto 文件加密示例
Win11如何设置省电模式 Win11开启电池节电功能【优化】
Win11怎么关闭通知中心_Windows11系统通知与专注助手设置
Win11文件夹预览图不显示怎么办_Win11缩略图缓存重建修复【教程】
MAC怎么设置程序窗口永远最前_MAC窗口置顶插件安装与快捷设置【方法】
如何在 Go 中创建包含映射(map)的切片(slice)结构
如何使用Golang实现容器自动化运维_Golang Docker运维管理方法
Go 语言标准库为何不提供泛型 Contains 方法:设计哲学与类型系统约束
php修改数据怎么批量改状态_批量更新status字段值技巧【操作】
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
mac怎么打开终端_MAC终端Terminal使用入门与常用命令【教程】
Mac怎么查看活动监视器_理解Mac进程和资源占用【指南】
php怎么下载安装并配置环境变量_命令行调用PHP技巧【技巧】
Win11任务栏颜色怎么改_Win11自定义任务栏配色设置【美化】
Python与Docker容器化部署实战_镜像构建与CI/CD流程
为什么本地php环境运行php脚本卡顿_php执行效率优化方法与设置【说明】
php中::能用于接口静态方法吗_接口静态方法调用规则【操作】
如何在Golang中解压文件_Golang compress/gzip解压操作方法
php中作用域操作符能访问私有静态属性吗_访问权限限制【指南】
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
Win10怎么卸载爱奇艺_Win10彻底卸载爱奇艺方法【步骤】
c++的位运算怎么用 与、或、异或、移位操作详解【底层知识】
Win11怎么激活Windows10_Win11激活Win10系统方法【步骤】
LINUX如何删除用户和用户组_Linux userdel和groupdel命令用法【系统管理】
Windows怎样拦截QQ浏览器广告_Windows拦截QQ浏览器广告方法【方法】
windows如何备份注册表_windows导出和导入注册表文件教程
c++中explicit(bool)的用法 c++条件性explicit【C++20】
Windows 10怎么隐藏特定更新补丁_Windows 10使用微软官方工具wushowhide.diagcab
如何在Golang中使用time处理时间_Golang time时间解析与格式化方法
php本地部署后session无法保存_session存储路径与权限设置技巧【技巧】
2026-01-01
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。