目录就是架构

每个模块都是一个自包含的 Laravel 子应用:

app/Modules/Cms
├── module.json
├── Providers/CmsServiceProvider.php
├── Models
├── Http/Controllers
├── Database/Migrations
├── routes
└── resources/views

模块之间没有 use 对方的模型。需要跨模块可见的内容,通过核心的 ContentHub 登记。

一个最小的模块清单

{
  "name": "cms",
  "provider": "App\\Modules\\Cms\\Providers\\CmsServiceProvider",
  "content_models": ["App\\Modules\\Cms\\Models\\Article"]
}

ModuleRegistryServiceProvider 在启动时读取所有 manifest,注册对应的 ServiceProvider。每个模块自行加载迁移、视图与路由。

内容总线

ContentHub::sync() 是唯一写入统一内容表的地方。模型通过 SyncsContentHub trait 在保存和删除时触发同步,标签也会被归一化后写入 tags 与 content_tag。

这让搜索、标签页、首页推荐和会员主页不需要知道模块内部结构。


模块化的价值不在于目录好看,而在于新增或移除一个业务时,不需要修改其他业务的代码。