# LOTIS:用对象取代 DOM 和异步调用的 PHP 框架
经过十年开发,LOTIS 框架的作者想出了一个激进的解决方案:摒弃标签和异步请求,转而采用面向对象的方法。结果呢?将 Web 应用构建成一个统一的整体,而无需将客户端与服务器分离。开发者使用领域对象而非 DOM 元素工作,大大缩短了实现业务逻辑所需的时间。
CMA 概念:从对象到元数据
LOTIS 架构的基础是 CMA 原则(构造-元数据-组装)。应用完全由实现基础 Construct 接口的对象构建而成。每个对象生成用于构建界面、启用响应性或创建 API 的元数据。关键组件是 Space 类,它从这些对象中组装 Web 应用。
与传统框架将标记与逻辑分离不同,LOTIS 允许你:
- 通过 PHP 对象描述 UI
- 在客户端和服务器上使用相同的变量
- 跳过手动异步操作处理
- 通过继承动态更改组件层次结构
最小工作示例展示了本质:
$div = LTS::Div()->capt("Hello from LOTIS!");
LTS::Space()->build($div);
这里,LTS::Div() 创建一个对象,而不是 HTML 标签。只有将对象传递给 Space 时才会进行 DOM 转换。这让你可以像经典桌面框架一样自由操纵应用结构。
实际案例:“Tracker” 记账系统
考虑这个来自库存跟踪和工资计算工作应用的代码片段。LOTIS 以紧凑的方式描述复杂逻辑,无需模板或 AJAX 调用:
$maindiv = LTS::DataView();
$maindiv->bindtodb($kassa, [
'head' => ['sel' => '', 'date' => 'Date'],
'inputs' => [
['name' => 'id', 'type' => 'hidden'],
['name' => 'date', 'type' => 'date', 'caption' => 'Date'],
['name' => 'save', 'caption' => 'Write', 'type' => 'button'],
['name' => 'close', 'caption' => 'Cancel', 'type' => 'button']
],
'cells' => ['save, close', 'date']
]);
$subtable = $maindiv->subtable('kassasubtable', $kassatable, [
'head' => [
'sel' => '',
'name' => 'Employee',
'pay' => 'Received',
'del' => ''
],
'inputs' => [
['name' => 'user', 'type' => 'table', 'dbtable' => $users, 'caption' => 'Employee'],
['name' => 'message', 'caption' => 'Onwartość'],
['name' => 'pay', 'type' => 'numeric', 'caption' => 'Issued']
]
]);
$maindiv->onsave(function ($args, $result) {
global $money, $users;
$paytable = $args['subtables']['kassasubtable'];
$stock = LTS::Stock($money);
$stock->collector($users, 'user', ['total' => 'pay']);
$stock->update(['doc' => $result['data']['id']], $paytable);
return $result;
});
注意文档保存处理:业务逻辑(如工资累积)被捕获在一个块中,无需客户端-服务器分离。JavaScript 钩子通过如 table->out() 等方法集成,无需异步模式专业知识。
开发者的优势
LOTIS 解决了传统 Web 开发中的三个核心问题:
- 消除逻辑重复 — 数据检查和转换在对象中定义一次,而不是散布在 JS 和 PHP 模块中
- 降低架构复杂性 — 无需设计 API 或管理加载状态
- 统一数据模型 — 对象更改通过元数据自动在客户端和服务器之间同步
它特别适合紧迫期限的项目:标准操作(表单、表格、验证)只需 3-5 行,而不是数十行。灵活性依然存在 — JS 钩子让你自定义任何内容,比如这个日期格式化:
$maindiv->table->out(<<<JS
function (row, obj) {
row.find('td.Column_date').text(obj.date.substr(0, 10));
}
JS);
关键点
- LOTIS 通过生成元数据的对象模型模糊了客户端-服务器界限
- 开发使用纯 PHP,无模板,但可以嵌入 JS 逻辑
- 在例行任务上节省时间:AJAX、验证、状态同步
- CMA 让相同对象服务于 UI、API 或离线模式
- Node.js 端口启用 PWA 和本地应用同步
当前实现针对速度关键的业务应用。下一个主要版本将添加 TypeScript 支持,并更好地与现代构建工具集成。对于厌倦了 DOM 包装器和 Promise 链的开发者,LOTIS 带来了 OOP 的简单性,而不牺牲 Web 能力。
— Editorial Team
暂无评论。