phpcms2008,phpcmsV9,yaf,ThinkPHP,QeePHP,CodeIgniter,Zend Framework 目錄結構小結.
說明:
本文希望通過查看一些開源的 PHP 項目和 PHP 框架發現有利于模塊化的項目目錄結構規則.
# PHPCMS 2008
- admin ——核心模塊后臺控制器
- * templates ——核心模塊后臺模板
- data ——文件緩存目錄
- images ——css, js, jpg 等文件目錄
- include ——核心模塊定義類文件。
- * admin ——核心模塊后臺定義類文件(如類,函數)
- * dict ——中文分詞數據文件
- * fields ——文章模型自定義字段文件。
- * fonts ——字體文件
- * ipdata ——IP數據文件
- languages ——多語言包
- * zh-cn ——簡體中文
- ** phpcms.lang.php ——核心模塊語言包
- ** guestbook.lang.php ——留言模塊語言包
- templates ——前臺模板目錄
- * default ——默認樣式
- ** phpcms ——核心模塊前臺模板
- ** guestbook ——留言模塊前臺模板
- uploadfile ——上傳文件目錄
- guestbook ——留言模塊
- * admin ——留言模塊后臺控制器
- ** templates ——留言模塊后臺模板
- * include ——留言模塊定義類文件。
- * index.php ——留言模塊首頁。
- admin.php ——后臺管理界面入口文件。
- index.php ——網站首頁。
phpcms2008 沒使用單一入口結構,所以處理請求的頁面(被瀏覽器直接訪問)散落在各個模塊目錄下,比如 guestbook/index.php.
此結構分成“核心+模塊”的目錄結構,核心模塊就是 phpcms 自身,包括后臺管理,后臺菜單,文章模型等 cms 的核心功能,模塊則像“留言”模塊。
此結構明確地提出“模塊”的概念,并以一級目錄劃分模塊(/guestbook/)。
但是,cms 核心功能并沒有作為一個“模塊”,于是在 admin.php 后臺入口中會看到類似這樣的代碼:
if ('phpcms' != $mod) { $path = "{$mod}/admin/{$file}.php"; }
需要判斷目標路徑是否核心(即 phpcms),核心則不需要追加模塊路徑,否則便加上模塊目錄路徑,因此這種結構造成了路徑的不統一。
另外,有兩個公共目錄 templates 和 languages,這兩個目錄下卻以模塊劃分,包括核心,即 templates/phpcms.這兩個目錄中的文件是在安裝一個模塊時從模塊目錄的 install 目錄下復制過去的,這也造成了路徑的不統一.
實際上,把前端模板都放在 templates/ 目錄下是有作用的,在 SVN 中設置權限就很多便,只需要把 templates 目錄設為前端人員開放即可,否則,若各模塊的模板分散在各模塊中,就像后臺模板,那就得遂個模塊地設置權限.
include 目錄下的文件沒有很好的分類,使得里面還包含了如 IP 數據庫,字體這樣的文件。
小結:此結構明確地以目錄劃分出“模塊”的概念,但目錄結構還不夠清晰和統一.
# PHPCMS V9
- admin.php ——后臺管理入口
- index.php ——程序主入口
- uploadfile ——網站附件目錄
- statics 系統附件包
- * css ——系統css包
- * images ——系統圖片包
- * js ——系統js包
- caches ——緩存文件目錄
- phpcms ——phpcms框架主目錄
- * languages ——框架語言包目錄
- ** zh-cn ——簡體中文
- *** comment.lang.php ——評論模塊語言文件。
- * libs ——框架主類庫、主函數庫目錄
- ** classes ——類定義文件,主要是公共代碼。
- ** data ——分詞數據,字體,IP數據目錄
- ** functions ——函數定義文件,主要是公共代碼。
- * model ——框架數據庫模型目錄
- ** comment_data_model.class.php ——評論模塊的一個模型。
- ** content_check_model.class.php ——內容模塊的一個模型。
- * modules ——框架模塊目錄
- ** comment ——評論模塊目錄
- *** classes ——類定義文件。
- *** functions ——函數定義文件。
- *** install ——安裝模塊時用到的文件。
- **** languages ——安裝時會復制到 phpcms/languages 下。
- **** templates ——安裝時會復制到 phpcms/templates/default/comment 下。
- *** templates ——后臺模板。
- *** index.php ——前臺控制器(類定義文件)
- *** comment_admin.php ——后臺控制器(類定義文件)
- * templates ——框架系統模板目錄
- ** default ——默認模板樣式
- *** content ——內容模塊的模板目錄
- *** comment ——評論模塊的模板目錄。
- * base.php 框架入口文件。 //Vevb.com
- phpsso_server ——phpsso主目錄(另一個系統,目錄下的結構跟上面一樣)
因為屬于 phpcms 的不同版本,因此跟 phpcms 2008 對比著看:
此結構使用了單一入口的結構,因此在根目錄下的文件比較少。
此結構使用了 static 表示 css, js 這類靜態文件,代替 phpcms2008 中的 images 目錄。
在 phpcms 目錄中,有 languages, model, templates 公共目錄,分別存放各模塊相應類型的文件。
phpcms/libs 目錄就相當于 phpcms2008 的 include 目錄。
phpcms/modules 就是各模塊目錄了,此結構中沒像 phpcms2008 那樣分成“核心+模塊”,而是所有功能都是模塊,其中 cms 功能就是 content(內容)模塊.
小結:明確地用目錄劃分出“模塊”的概念,并且所有功能都以模塊的形式存在,但不明白為什么 model 要作為公共目錄,而不是分散在各模塊目錄之下.
# Yaf 2.2.7 框架
- public
- * index.php ——入口文件
- * .htaccess ——重寫規則
- ** css
- ** img
- ** js
- conf
- * application.ini ——配置文件
- application
- * controllers ——默認模塊控制器目錄
- ** Index.php ——默認控制器
- * views ——默認模塊視圖目錄
- ** index ——控制器名
- *** index.phtml ——默認視圖
- modules ——其他模塊
- * mymod ——mymod模塊目錄(下級目錄結構跟 application 目錄結構相似)
- library ——本地類庫
- models ——model目錄
- plugins ——插件目錄
此結構使用的是單一入口結構,因此根目錄文件較少,并且入口文件及 css, img, js 這類靜態文件單獨地放在 public 目錄下,與其它源代碼文件相分開,在配置服務器時只需要把 public 設為根目錄即可,可避免其它源代碼文件直接被瀏覽器訪問.
使用了“默認模塊+其它模塊”的結構,在 application 目錄下的為默認模塊,在 modules 目錄下的為其它模塊,明確地以目錄劃分出了“模塊”的概念.
不明白為什么 models 目錄放在根目錄下,而不是分散在各模塊目錄中.
# ThinkPHP 3.0 框架
分兩種模式,一是不使用“模塊分組”,另一種是使用“模塊分組”.
## 不使用模塊分組
- ThinkPHP ——框架目錄
- Public ——公共資源目錄(即 css, js, img 這類)
- Uploads ——上傳文件目錄
- Home ——前臺項目目錄
- * Common ——公共文件目錄,如公共類,函數。
- * Conf ——項目配置目錄。
- * Lang ——語言包
- * Lib ——類庫目錄
- ** Action ——控制器目錄
- ** Model ——模型目錄。
- * Tpl ——模板目錄
- Admin ——后臺管理項目目錄。
- index.php ——home項目入口文件。
- admin.php ——admin項目入口文件。
此結構基本看不出“模塊”的概念,連前臺與后臺都需要分成兩個項目(Home,Admin)來劃分.
## 使用模塊分組
ThinkPHP ——框架目錄
- App ——項目目錄
- * Common ——公共文件目錄
- ** Home ——Home分組的公共文件。
- * Conf ——配置目錄
- * Lib ——類庫目錄
- ** Action ——控制器目錄
- *** Home ——Home分組控制器
- ** Model ——模型目錄
- *** Home ——Home分組模型目錄。
- * Tpl ——模板目錄
- ** Home ——Home分組模板目錄
- Public ——略
- Uploads ——略
- index.php ——入口文件。
同樣看不出“模塊”的概念,使用“分組”概念把上面前后臺要分兩個項目的結構組合成“分組”的結構.
小結:ThinkPHP 的目錄結構并不利于模塊化,因為一個模塊的若干文件都需要分散于多個不同的目錄下,又或者,把一個模塊做成一個“項目”或“分組”.
# Fleaphp 框架
- App ——項目目錄
- * Admin ——后臺文件
- ** Controller ——控制器目錄
- ** Model ——模型目錄
- ** View ——模板目錄。
- * Front ——前臺文件(下級目錄結構與 App/Admin 相似)
- FLEA ——框架目錄
- Stuff ——靜態資料文件目錄
- * css
- * images
- * js
- index.php ——前臺入口文件。
- admin.php ——后臺入口文件。
此框架年代久遠,其主頁已不存在,在不看源代碼的情況下,只能通過網上一些零散的文章拼湊出它的目錄結構.
此結構與 ThinkPHP 的結構基本相似.
# QeePHP 框架
- _code ——保存所有的代碼,以及配置文件等。
- * app ——項目目錄
- * controller ——控制器目錄
- * model ——模型目錄
- * view ——模板目錄
- * config ——配置文件目錄
- * lib ——第三方庫文件
- _devel ——保存應用程序開發過程中使用到的文件(如數據庫安裝SQL)。
- css
- js
- img
- index.php ——入口文件
明確地使用 lib 目錄保存第三方庫文件(yaf 框架也有 library 目錄,但其用戶手冊中并沒明確說明是否用于保存第三方庫文件)。
其余跟 FleaPHP 相似.
# CodeIgniter 2.1.0 框架
- application ——項目目錄
- * controllers ——控制器(用戶手冊中表示可以建立子目錄對控制器進行劃分)
- * models ——模型目錄。(用戶手冊中表示支持子目錄劃分)
- * views ——模板目錄(用戶手冊中表示支持子目錄劃分)
- system ——框架目錄
- index.php ——入口文件
比較簡單的一個目錄結構,且 MVC 三個目錄好像都支持自定義任意層級的子目錄結構,因為其加載代碼是這樣的:
$this->load->view('folder_name/file_name');
$this->load->model('blog/queries');
查看用戶手冊,發現 CI 中也有類似于 ThinkPHP 的“模塊分組”的概念,目錄結構可以是:
applications/foo/controllers/ ——foo 分組
applications/bar/controllers/ ——bar 分組。
# Zend 框架
- application ——項目目錄
- * controllers ——控制器目錄
- * models ——模型目錄
- * views —— 模板目錄
- library
- * Zend Framework
- public ——公共資源目錄
- * images
- * scripts
- * styles
通過幾個框架的目錄結構對比,可以發現框架的目錄結構基本都很相似.
# 小結
上述目錄結構,大概可分成兩類:
1. 以“模塊”概念為第一級目錄劃分的結構;
2. 以 MVC 結構為第一級目錄劃分的結構。
以“模塊化”的角度來看,以“模塊”為第一級目錄劃分更有利于模塊化,因為并不是所有模塊都使用 MVC 三層結構(比如一個用于生成壓縮包的功能模塊),并且更利于模塊內文件的管理。
另外:單一入口可使目錄結構更靈活多變,應優先考慮使用單一入口結構。
使用一個 lib 目錄保存所有第三方代碼可方便地區分項目代碼與第三方代碼,源代碼版本管理時也能方便地把第三方代碼排除在外。
使用一個 public 目錄保存需要被瀏覽器直接請求的文件,其余文件放在 public 目錄之外,可以避免瀏覽器直接訪問其它文件(如類定義文件).
新聞熱點
疑難解答