
架构不是文档,它是管理员。
20 Apr 2026
大多数管理面板在数据模型已经存在后会手动构建第二次:这里一个列表视图,那里一个表单,API 和 UI 之间的验证重复。Phlo CMS 从这一点出发,认为这是浪费精力。您只需声明一次数据的外观,CMS 就会生成其余部分。
static schema => arr(
id: field(type: 'token', title: 'ID', list: false, record: false),
title: field(type: 'text', required: true, search: true),
body: field(type: 'wysiwyg', list: false),
cover: field(type: 'image', list: false),
author: field(type: 'parent', obj: 'author', required: true),
topics: field(type: 'many', obj: 'topic', table: 'article_topic'),
)
从那一个声明,CMS 生成一个侧边栏条目,一个带有计数和搜索的分页列表,一个解析了关系的记录视图,带有每个字段类型正确输入的创建和编辑表单,以及一个共享与表单完全相同验证的 REST API(POST/PUT/PATCH/DELETE)。列表视图或 API 中没有任何手动编写的内容;两者都读取相同的模式。
关系只是字段类型
parent、child 和 many 的声明方式与其他字段完全相同,并且可以通过普通属性访问读取:$article->author、$author->articles、$article->topics。应用代码中没有连接 SQL,也没有单独的关系配置文件;关系存在于表示它的列上,在模式中。
只为你使用的付费
field(type: 'x', ...) 是 fields/x 资源的简写。加载字段类型只需在应用的资源中列出它,因此一个从未使用 wysiwyg 字段的应用不会包含 wysiwyg 编辑器的代码。一个五字段的博客和一个五十字段的后台各自只拉取它们实际使用的内容,没有共享的内容被一起拉入。
仪表板小部件,也免费
一个模型可以在 CMS 首页固定一个小部件:
static objWidgets => [
'Articles' => obj(type: 'gauge', data: static::item(columns: 'COUNT(id)')),
]
CMS首页不再是一个菜单,而是数据的实时概览,来自相同的模式,再次呈现。
从真实的模式开始,而不是空白页面
手动选择数据库、表名和字段列表是编写模型的大部分工作。CMS builder 正是将这个选择转化为一个准备好的模型文件,包括你正在一起定义的模型之间的关系连接,因此磁盘上的模型与您刚刚描述的内容相匹配,而不是从记忆中重新输入。