皮肤

Diperbarui 2026-11-06

一个皮肤就是一个目录 skins/<slug>/,里面必须有 skin.json:

{
    "name": "Nomen 2026",
    "version": "1.0.0",
    "description": "默认皮肤",
    "license": "GPL-3.0-only",
    "author": ["Yunyun"]
}

目录名就是 slug,写进 config/skins.php 的 default(或环境变量 DEFAULT_SKIN)就是站点默认皮肤。用户可以在设置页换自己的,登录后写进 users.skin。

目录

路径作用
layouts/页面外壳(default / app / admin / open),提供哪个就覆盖哪个
templates/页面模板覆盖,和核心 templates/ 同名就顶掉
partials/皮肤自己的片段,布局里按相对路径 require
css/、js/皮肤自己的静态资源(放 public/assets/skins/<slug>/ 也行)

模板覆盖

Response::view('landing') 的查找顺序:

  1. 当前皮肤的 templates/landing.php

  2. 默认皮肤的 templates/landing.php

  3. 核心的 templates/landing.php

想改首页、登录页、注册页,直接把同名文件放进皮肤目录,不用动核心。

品牌变量

页面上能看到的东西都从 config/brand.php 取,别在布局里写死:

键说明
name站点名,标题、左上角、页脚都用它
logo站点图标,左上角、favicon 都用它
base_url绝对地址,canonical 和示例代码用它
copyright页脚版权行,留空就不显示
footer_links页脚链接数组,每项 ['label' => ..., 'url' => ...]
powered_by页脚那句 Powered by,false 关掉

注意

  • 布局和模板都是直接 require 的 PHP,皮肤代码等于站点代码权限,只装信得过的。

  • 应用的路由、POST 逻辑、CSRF 在控制器里,皮肤只决定长什么样。

  • 改完不用清缓存,下一页就生效;改了 CSS 记得换 ?v=。