// +---------------------------------------------------------------------- declare(strict_types=1); namespace app\appmall\middleware; use app\appmall\library\AppmallMenu; use app\appmall\library\AppmallSchema; /** * 应用市场「表结构 + 菜单兜底」中间件(应用级注册于 app/appmall/middleware.php)。 * * 作用:任何进入 /appmall/* 的请求(前台页 / 后台页 / 对外 API / 未注册路由) * 都先把本模块 13 张表与老库缺失字段补齐,杜绝「中心站新装后访问某入口报 * 1146 Table doesn't exist / 1054 Unknown column」——这正是模块迁移为 * 普通应用、不再走插件安装 SQL 之后最容易踩的坑。 * 同时把内置菜单清单(见 AppmallMenu 常量)幂等注入 backend_power / * member_rule(模块迁出 addon/ 后 install.php 的 createMenu 不再执行)。 * * 设计要点: * - 幂等且极轻:AppmallSchema 内部按「表 / 表+列」做进程内 memo, * 每请求最多各一次 SHOW TABLES、SHOW COLUMNS,已在的库几乎零开销; * - 无版本号:不做版本比对、不需要迁移脚本,纯探测式兜底; * - 绝不阻断业务:DB 未连接、账号无 CREATE/ALTER 权限等异常一律静默吞掉, * 由后续业务报错暴露(与框架既有自愈引擎的降级策略一致)。 * * @author ywxapp */ class AppmallSchemaMiddleware { public function handle($request, \Closure $next) { try { AppmallSchema::ensure(); } catch (\Throwable $e) { // 自愈失败不影响本次请求 } // 菜单兜底:menu.json → backend_power / member_rule(幂等,见 AppmallMenu) try { AppmallMenu::ensure(); } catch (\Throwable $e) { // 菜单兜底失败不影响本次请求 } return $next($request); } }