PHP的FastAdmin架构适合二次开发吗_特点分析【介绍】
技术百科
看不見的法師
发布时间:2026-01-01
浏览: 次 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或空类 - 若需重写 index 方法,先复制
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,而非手动赋值
表格 JS 配置别改全局 bootstrapTable,默认参数藏在 table.js 里
想禁用 Excel 导出?不是删 HTML 按钮,而是改 JS 初始化里的 showexport: false;想隐藏列切换按钮?设 showcolumns: false。这些都在 public/assets/js/bac 的
kend/xxx.jsController.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 时,核心代码一覆盖就丢功能;插件目录不动,逻辑就稳。
- 插件安装后自动注册服务提供者,无需手动 require
- 事件名用英文小写+下划线,避免驼峰,防止 Windows 下大小写不敏感导致加载失败
- 权限控制尽量走注解或
Auth::instance()->check('rule'),别靠 session 变量硬判断
真正卡住二次开发进度的,从来不是功能写不出来,而是没意识到 FastAdmin 的“约定大于配置”有多强——它不拦你自由发挥,但一旦偏离路径,就会在权限、分页、导出、搜索这些看似琐碎的地方反复报错。把控制器继承、模型访问器、JS 表格参数、插件事件这四条线理顺,剩下的就是填业务了。
# excel
# windows
# app
# js
# json
# go
# if
# html
# require
# 架构
# 前端
# 封装
# session
# php
# 中间件
# 父类
# bootstrap
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win10怎么查看内存时序参数_Win10CPU-
- Python安全爬虫设计_IP代理池与验证码识别策
- Python lxml的etree和Element
- php下载安装选zip还是msi格式_两种安装包对
- mac怎么看硬盘大小_MAC查看磁盘存储空间与文件
- 如何在Golang中实现文件下载_Golang文件
- PHP中require语句后直接调用返回对象方法的
- Win11文件夹预览图不显示怎么办_Win11缩略
- Windows11怎样开启游戏模式_Windows
- Linux如何挂载新硬盘_Linux磁盘分区格式化
- 如何使用Golang reflect检查方法数量_
- 如何开启Windows的远程服务器管理工具(RSA
- Windows家庭版如何开启组策略(gpedit.
- 如何使用Golang安装API文档生成工具_快速生
- Win11怎么压缩文件 Win11自带压缩解压功能
- 如何使用 Selenium 正确获取篮球参考网站球
- MAC怎么使用表情符号面板_MAC Emoji快捷
- PHP 中 require() 语句返回值的用法详
- 如何处理“XML格式不正确”错误 常见XML we
- Win11怎么连接蓝牙耳机_Win11蓝牙设备配对
- Win10怎样卸载自带Edge_Win10卸载Ed
- Python字符串操作教程_切片拼接与格式化详解
- Win11怎么把图标拖到任务栏_Win11固定应用
- Win10如何设置双wan路由器 Win10双wa
- Win11怎么恢复旧版开始菜单_通过软件还原Win
- Win11如何设置文件权限 Win11 NTFS文
- php报错怎么查看_定位PHP致命错误与警告的方法
- c++的mutex和lock_guard如何使用
- c++怎么编写动态链接库dll_c++ __dec
- Linux怎么查找死循环进程_Linux系统负载分
- Linux怎么设置磁盘配额_Linux系统Quot
- c# 如何深拷贝和浅拷贝
- Python多线程使用规范_线程安全解析【教程】
- LINUX怎么设置系统语言_LINUX修改中文环境
- Win11怎么关闭自动维护 Win11禁用系统自动
- Win11此电脑不在桌面上_Windows 11桌
- Win11怎么查看硬盘型号_Windows 11检
- c++ unordered_map怎么用 c++哈
- Python文件和流处理指南_高效读写大体积数据文
- c++ nullptr与NULL区别_c++11空
- PHP的Workerman对架构扩展有啥帮助_应用
- php怎么操作Redis_Redis扩展连接与基本
- PHP主流架构如何做单元测试_工具与流程【详解】
- Windows10如何重置此电脑_Windows1
- 如何在Golang中实现基础配置管理功能_Gola
- Win11怎么忘记WiFi网络_Win11删除已保
- 如何在 Windows 11 中使用 AlomWa
- 如何在 Python 中将 ISO 8601 时间
- Win11怎么关闭触控板_Win11笔记本禁用触摸
- 如何在Golang中引入测试模块_Golang测试

QQ客服