🔄 请求生命周期
每个请求都从 index.php 开始
- 定义常量(
ROOT、APP、CONFIG) - 加载辅助函数
- 检查是否已安装(
config/database.php是否存在?) - 如果未安装 → 重定向到
/install/ - 加载数据库配置 + 辅助函数,启动会话
- 计算请求路径(处理子目录安装)
- 通过
app/router.php调度
路由器
app/router.php 是一个扁平的模式匹配调度表。模式被编译为正则表达式并与请求路径进行匹配。捕获组作为控制器方法参数传递。
身份验证
大多数控制器调用 require_auth(),该函数将未认证用户重定向到 /login。仅限管理员的端点使用 require_admin(),返回 403 JSON。
登录时会话填充 user_id、workspace_id、role,并重新生成以防止会话固定攻击。
数据库连接
PDO 连接在首次查询时延迟创建(单例模式)。使用 ERRMODE_EXCEPTION 和真正的预处理语句(EMULATE_PREPARES = false)。
响应格式
- HTML 页面: 控制器设置
$page并包含layout.php - JSON API:
json_response()设置 Content-Type,输出 JSON,退出 - SSE 流: 使用
text/event-stream的持久循环,每 2 秒 ping,55 秒后退出