开发者总览
这一节写给要扩展系统的人。用户手册在 使用手册。
技术栈
| 部分 | 用的什么 |
|---|---|
| 语言 | 原生 PHP 8.0+ |
| 数据库 | Eloquent ORM(illuminate/database) |
| 模板 | Smarty 3.1 + PHP 原生渲染 |
| 会话 | PHP session |
| 路由 | 单入口 index.php,通过 ?s=/路径 分发 |
目录结构
app/
Controller/ 控制器:Admin(后台) User(前台) Shared(对接) Install
Service/ 业务逻辑,下单、充值、发货都在 Service/Bind/
Model/ Eloquent 模型
View/ 模板,User/Theme/ 下是各套前台主题
Plugin/ 插件
Pay/ 支付插件
Consts/Hook.php Hook 点位常量
kernel/ 内核:路由、注解、插件加载、工具类
config/ 配置文件(数据库连接等)
runtime/ 运行时缓存与日志三种扩展方式
| 方式 | 适合 | 文档 |
|---|---|---|
| Hook 钩子 | 在系统既有流程里插一脚(下单后发通知、注册时风控) | Hook 钩子大全 |
| 插件 | 完整功能模块,有自己的页面、配置、路由 | 插件开发 |
| 支付插件 | 对接一个新的支付平台 | 支付插件开发 |
外部系统要拉商品、下单,用 API 对接。
开发前必须知道的几条
这几条踩过的人都知道有多疼:
1. hook() 的参数是按引用传的,实参必须是变量。
php
hook(P, new X()); // 致命 500
hook(P, $this->getUser()); // 致命 500
hook(P, ['a' => 1]); // 致命 500
$user = $this->getUser();
hook(P, $user); // 正确而且只有真跑到那一行才炸,测试时很容易漏。
2. 生命周期注解必须写命名参数。
php
#[Plugin(state: Plugin::INSTALL)] // 正确
#[Plugin(Plugin::INSTALL)] // 静默不触发,插件"启用成功"但建表没跑3. update.php 跑在新代码覆盖之前。
升级脚本执行时,新版本的文件还没复制进来。里面引用新版才有的类、常量、方法,异常会被静默吞掉。只能用旧版 API 和字面量。
4. 新增 Hook 文件后要停用再启用插件。
runtime/plugin/hook 是编译出来的注册表缓存,只在插件启用时重建。光刷新页面不会生效。
5. 清模板缓存只删 runtime/view/compile。
不要删 runtime/config,那是配置缓存,删了整站会出问题。
调试
出问题先看网站根目录的 runtime.log(不是 runtime/log/)。
DEBUG=false 时任何未捕获异常都会渲染成 404 页面并返回 HTTP 500,真实原因只在 runtime.log 里。
