- 论坛徽章:
- 0
|
先不看具体架构, 来看看程序的入口.
论坛中设两个全局变量
1. $g_App : 顾名思义, 主体的实例.
2. $g_Registry : 存储其他 "全局性" 变量的仓库.
这样一来, 无论是论坛被 embed 还是第三方为这个论坛开发插件, 都不用担心主要变量被 "不小心" 覆盖了, 也就是解决了一个 namespace 问题.
位于 /index.php 中的主循环
$g_App =& forumApp::getInstance();
$g_App->;initialize() // 读入 config, 初始化 db 等
$g_App->;go(); // 运行具体的内容
---------------------------------------------------------------------
假设这个论坛为模块化的架构, 根目录中的 directory structure 如下:
/data : 存放附件, 头像等长期数据
/log : 论坛运行日志
/modules : 论坛模块仓库
/themes : 风格定义 (颜色, 字体的 css, tpl 模板文件不存储在这里!)
/tmp : 存放 session, cache 等临时数据
/modules 下存储论坛所有的模块, 论坛自身的核心也是一个模块, 例如:
/modules/kernel : 核心模快, 存放一些抽象基类, 基本的接口, 方法
/modules/forum : 论坛基本模块, 例如 forumdisplay, post 等页面存放在这里
/modules/bank : (举个例子, 银行插件模块, 也可以是其他插件)
/modules/album : (例如还可以是论坛相册这种大型模块)
每一个标准的模块下包含一个工厂类定义文件, 例如 forum 模块为 forumFactory, bank 模块为 bankFactory, 他们都必须继承核心模块 modules/kernel 中的 moduleFactory 基类.
$g_App 根据用户请求决定调用某个模块,
例如用户请求为 /index.php?call=forum:post¶m=... 含义为调用 forum 模块中的 post 过程来县是一个发帖界面
forumApp::go() 方法的实现:
function go() {
$factory = new $userRequestModuleFactory; // 建立工厂, 如 forumFactory
$proc = $factory->;createProcedure($userRequestProc); // 工厂生产出用户需要的 "过程"
$proc->;triggerEvents() // 处理事件的典型调用, 设计的时候可以隐含, 将其放入 proc 的构造子
printAsHtml($proc->;getView()); // 万事大吉... (终于显示出 Hello World 了...)
}
而在 /modules/forum/post.php 这个过程文件中就实现具体的事件处理, 至于方式, 在架构上可以用 MVC, 设计模式上可以用观察者模式, 命令模式等等 (写起来累, 看起来更累, 你更不用期待热心会员会给你扩展插件了, 多数会员十有八九在找到你这些 "复杂模式" 的运行入口在哪里之前已经失去了耐心), 所以为简单起见, 你甚至可以啥都不用, 以最菜鸟的编程方法完成你的逻辑, 只要你能实现 getView 接口, 可以打印出页面来就 ok!
在 /modules/kernel 中需要做一个集成大多数功能调用的 "God" API Interface, 类本身不干什么, 空投支票一张, 只是起个桥梁作用, 调用其他类模块的方法, 充当两个角色, (偷懒, 不用分开写多个, God 也无所谓了)
1. Facade 模式, 应答客户端请求 (在这里客户端就是 $g_App)
2. Mediator 模式, 是一个 cross-module interface
这样的话, 只要 facadeApi 中的接口不变, 你可以尽管放心将核心升级至 2.0, 而不用担心 1.0 中的上百个 hack 全部报废. (实际寿命可能没有那么乐观, 但好过没有, 真讲究长寿就去做 adapter)
另外, 诸如论坛的 languages 语言文件, tpl 模板文件, 都存放在各个相应的 modules 下面, 这样每个 module 都不失其独立完整性, 安装卸载都一干二净. 当然, 如果实际运行时调用觉得不方便或者分开搞效率不高, 你可以写一个工具, 把每个 module 下的语言和模板编译一下, 抽出来集中放一个地方, 如果模块改了或者卸载了重新读取编译一下就可以了.
大致思路就是这样. ^^ |
|