#1 jake

本文将讲述如何构架一个适合大规模应用程序的目录结构,以及应用目录的合理性建议。
请注意,如果是小型应用程序,使用SpeedPHP默认的controller / model等几个目录结构即可,这里讲述的是针对较大规模应用程序的部署。

首先我们来看一下本文将解决哪些问题:


  • sp框架能否支持modules(模块)式的开发? 支持
  • sp框架如何部署成多入口的应用程序?
  • 如何共用类库?
  • 如何放置各种页面模板?
  • 各应用程序(模块)如何共用同一配置信息?
  • sp框架能放在任何目录下使用吗? 可以
  • 媒体文件(图片、样式、JS脚本)如何放置比较合理?
  • 目录安全性建议?
本文代码下载:release-dirs.zip

截图:
release-dirs[1].gif
下面介绍各目录和文件的作用。


config.php

config.php文件是全站通用配置文件,config.php的作用包括:


  • 定义APP_PATH和SP_PATH常量,由于config.php文件的位置在应用程序主目录,所以config.php可以替代入口文件来定义这两个常量。
  • 对应用程序进行部分设置,比如时区设置。
  • 载入其他库类文件,比如载入用户自定义的函数文件(本例中是lib/functions.php文件)
  • 定义全站通用配置,如数据库定义,模板引擎定义等,也就是$spConfig的定义。这里要注意本例中相关的多个路径配置已被改变,如model目录的被定义成了“APP_PATH.'/lib'”。
index.php admin.php member.php produce.php

各模块(模块也是:modules / 子系统 / 应用程序,以下都以模块为统称)的入口文件,每个入口文件均可以代表一个模块,在各个入口文件中,还可以定义以下内容:


  • 首先必须载入config.php文件
  • 定义本模块的controller(控制器)路径,如admin.php中对controller路径的定义为“$spConfig['controller_path'] = APP_PATH.'/modules/'.basename(__FILE__,".php");”,该语言可以自动获取到入口文件的名称,并设置该模块的控制器目录与入口文件名称一致。也就是说,admin.php入口文件对应的控制器文件目录就是 APP_PATH / modules / admin 目录。
  • 载入SpeedPHP,开始执行程序。
lib目录

放置网站共用的类库文件,类库文件包括数据库模型类(spModel的派生类),操作类,第三方类库以及用户自定义函数等,由于这些类库在各个模块都会被用到,所以放置到独立的目录中,方便管理和重用。

release-dir3[1].gif

modules目录

相等于普通SpeedPHP应用程序的controller(控制器)目录,但是由于各个入口文件均有不同不配置,所以modules目录下还将分成与各入口文件名称相同的目录,分别存放各模块的控制器文件。

release-dir2[1].gif

template目录

放置html模板文件,template目录下可以按各模块的不同,分成不同的子目录来存放各模块的HTML模板文件。

这些模板当中,类似头部文件(header.html),底部文件(footer.html)等可以通用的模板文件,可以直接放在template目录目录下,让各HTML模板可以简单地引用。

请注意,在各个控制器中输出HTML模板的时候,要加上模板目录的名称:

function index(){ // 这里是首页
        $this->contents = "产品模块首页内容";
        $this->display("produce/main_index.html");
}
themes目录

放置图片、样式、JS脚本文件(统称媒体文件),这些文件可以根据使用的范围不同,而再进行分子目录,比如前台的媒体文件放到 template / index目录中,后台的媒体文件放置到 template / admin 目录中。

当然,这些媒体文件,也可以用其他方式存放,比如统一放到根目录的images下面,再在images下分开子目录。
无论如何放置,媒体文件放置的要点就是:将媒体文件与PHP、HTML模板都要分开,使得媒体文件可以独立管理,独立使用。

release-dir4[1].gif

tmp目录

临时文件目录


uploads目录

放置上传的文件的目录,对该目录的建议有:


  • 上传文件最好按“年-月”作为目录形式来放置,如果每日上传量比较大,可以用“年-月-日”的目录形式来放置,最终要保证同一目录下文件不能太多,建议值是不要超过1024个文件。
  • 可上传文件要进行限制,建议仅能上传图片,压缩包等,以保证系统安全。
目录大致为上述,下面我们来回答前面的问题(虽然可能答案已经呼之欲出了):

  • sp框架能否支持modules(模块)式的开发? 支持,每个模块有独立的控制器目录,同时共用类库,方便移植和重用。
  • sp框架如何部署成多入口的应用程序? 可以,上述中 admin.php / index.php / produce.php / member.php  都是入口文件,这些入口文件各不影响,而且可以通过config.php拥有统一的配置,还可以自定义本模块的特殊设置,如admin模块希望不使用伪静态URL网址。
  • 如何共用类库?在lib目录中可以共用这些类库文件,包括数据库模型类(spModel的派生类),操作类,第三方类库以及用户自定义函数等,这些文件可是各个程序的精华所在,很多时候一个公司或团队最大的财富就是看他们积累了多少这种方便实用的公用类库。
  • 如何放置各种页面模板?看template目录,各模块分别放到自己模块名称的模板目录中,共用的模板放到template目录中。
  • 各应用程序(模块)如何共用同一配置信息?通过统一的config.php文件
  • sp框架能放在任何目录下使用吗? 可以,在很久之前(多久?),SpeedPHP框架就已经解决了二级目录需要设置的问题,现在不需要任何设置,框架都可以在任何目录活得好好的。
  • 媒体文件(图片、样式、JS脚本)如何放置比较合理?原则是:将媒体文件与PHP、HTML模板都要分开,使得媒体文件可以独立管理,独立使用。
  • 目录安全性建议?目录安全性方面,我们希望外部访问者仅能访问到各个入口文件以及媒体文件(包括uploads目录内的上传文件),其他的控制器、类库、临时文件、模板文件等均不可访问。也就是说,主目录中的admin.php / index.php 等多个入口文件,和themes目录,uploads目录中的文件,设置成 755,其他目录均是 700。


2012-08-05 11:33:44