開發者總覽
這一節寫給要擴充套件系統的人。使用者手冊在 使用手冊。
技術棧
| 部分 | 用的什麼 |
|---|---|
| 語言 | 原生 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 裡。
