Skip to content

开发者总览

这一节写给要扩展系统的人。用户手册在 使用手册

技术栈

部分用的什么
语言原生 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 里。

基于 MIT 协议开源