免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2501 | 回复: 2
打印 上一主题 下一主题

抛瓦一片 ^^ 一个 PHP 论坛的模块化架构设计思考 .... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-02-19 12:17 |只看该作者 |倒序浏览
先不看具体架构, 来看看程序的入口.

论坛中设两个全局变量
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&param=... 含义为调用 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 下的语言和模板编译一下, 抽出来集中放一个地方, 如果模块改了或者卸载了重新读取编译一下就可以了.

大致思路就是这样. ^^

论坛徽章:
0
2 [报告]
发表于 2005-02-20 08:26 |只看该作者

抛瓦一片 ^^ 一个 PHP 论坛的模块化架构设计思考 ....

我现在是不是很浮躁? 觉得楼主从头至尾没有什么有用的话. 惭愧

论坛徽章:
0
3 [报告]
发表于 2005-02-21 13:59 |只看该作者

抛瓦一片 ^^ 一个 PHP 论坛的模块化架构设计思考 ....

有点像 xoops 的思路?? 不过没认真看过XOOPS的代码,随便掺和一句
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP