1.模塊結構
完整的ThinkPHP用用圍繞模塊/控制器/操作設計,並支持多個入口文件盒多級控制。ThinkPHP默認PATHINFO模式,如下:
http://serverName/index.php(或者其他應用入口文件)/模塊/控制器/操作/[參數名/參數值...]
應用:由同一個入口文件訪問的項目稱為一個應用,在完整版的代碼中就是Application
模塊:一個應用下面可以包含多個模塊,每個模塊對應獨立的目錄,在完整版的代碼中有Admin,Home,Common,Runtime四個模塊
控制器:每個模塊下有多個控制器,放在Controller目錄里面,控制器對應一個單獨的php類文件
操作:在控制器中又可以包含多個操作方法,還可以邦東某個操作類,每個操作就是URL訪問的最小單元,這個有點迷惑,類不是方法,可以有返回值么?
2.模塊設計
模塊的目錄結構如下:
Application 默認應用目錄(可以設置)├─Common 公共模塊(不能直接訪問)├─Home 前台模塊├─Admin 后台模塊├─... 其他更多模塊├─Runtime 默認運行時目錄(可以設置)
模塊不是固定的,可以方便的刪除添加,但是一般Common,Runtime兩個不用刪除。
在模塊內部又可以包含配置,控制器,模型等目錄,結構如下:
├─Module 模塊目錄│ ├─Conf 配置文件目錄│ ├─Common 公共函數目錄│ ├─Controller 控制器目錄│ ├─Model 模型目錄│ ├─Logic 邏輯目錄(可選)│ ├─Service Service目錄(可選)│ ... 更多分層目錄可選│ └─View 視圖目錄
除了Common和Conf目錄之外,其他的可以靈活的添加和刪除。
Common模塊是一個公共模塊,訪問所有模塊之前都會首先加載這個公共模塊下的配置文件Conf/config.php和公共函數文件Common/function.php,但是沒有找到這個function.php文件,Common模塊本身不能通過URL直接訪問,公共模塊中的其他文件可以被其他模塊集成或者調用。此外公共模塊的位置可以通過COMMON_PATH常量改變,在入口文件中重新定義COMMON_PATH如下:
define('COMMON_PATH','./Common/');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
目錄結構變化如下
www WEB部署目錄(或者子目錄)├─index.php 入口文件├─README.md README文件├─Common 應用公共模塊目錄├─Application 應用模塊目錄├─Public 應用資源文件目錄└─ThinkPHP 框架目錄
我這里不是用define('COMMON_PATH','./Common/');生成的,而是define('COMMON_PATH','Common/');去掉了前面的./,生成目錄截圖如下:

這樣Application目錄下的Common目錄就沒有作用了。
3.自動生成模塊目錄
3.2.2版本開始可以自動生成默認模塊和自動生成控制器和模型,例如現在要生成一個Admin模塊用於網站后台管理,可以在入口文件下面添加下面代碼
// 綁定Admin模塊到當前入口文件 define('BIND_MODULE','Admin'); define('APP_PATH','./Application/'); require './ThinkPHP/ThinkPHP.php';
然后刷新就可以在Application目錄下面生成一個Admin目錄,並且在Controller目錄里面生成一個默認的控制器IndexController.Class.php文件,手冊中的注釋是綁定Admin模塊到當前入口文件,其實這句話的具體作用是:如果沒有應用下面沒有Admin這個模塊那么自動生成這個模塊並以此模塊作為入口文件,注意如果綁定的是Home這個模塊,而去訪問Admin這個目錄就會報錯的,http://Servername/thinkphp/index.php/Admin/Index,錯誤內容是:
無法加載控制器:Admin
還有一點,如果生成模塊之后我們刪除這句綁定,就沒有錯了,這樣可以隨便訪問任何模塊。
生成模塊之后我們還可以自動在模塊內生成控制器和模型文件,代碼如下:
define('BIND_MODULE','Admin'); define('BUILD_CONTROLLER_LIST','Index,User,Menu');
注意這兩句要一起執行,我測試發現如果開始執行第一句生成模塊,再加上后面一句生成控制器的時候是不成功的,要刪掉這個Admin目錄,然后執行,這樣會生成目錄然后再Controller目錄下生成控制器文件,這個有點傻瓜。
生成的控制器是繼承自Think\Controller下。也可以實用命令行來生成控制器,這里我在贅述。
同樣的道理也可以自動生成模型,代碼如下:
define('BIND_MODULE','Admin'); define('BUILD_CONTROLLER_LIST','Index,User,Menu'); define('BUILD_MODEL_LIST','User,Menu'); define('APP_PATH','./Application/'); require './ThinkPHP/ThinkPHP.php';
同樣的,不能有先后順序,就是說這三句必須一起執行才有效,不能逐一執行。控制器繼承自Think\Model
據我觀察,如果沒有綁定模塊是會自動生成Home模塊並訪問這個模塊的
系統默認配置中是禁止訪問Common模塊和Runtime模塊,我們也可自己添加禁止訪問的模塊,代碼如下:
// 設置禁止訪問的模塊列表 'MODULE_DENY_LIST' => array('Common','Runtime','Api'),
同樣也可設置可以訪問的模塊和默認模塊,代碼如下:
'MODULE_ALLOW_LIST' => array('Home','Admin','User'),
'DEFAULT_MODULE' => 'Home',
據我觀察,就算不設置默認模塊,ThinkPHP也會默認生成並訪問Home模塊。
如果項目比較簡單,還可以設置單模塊,代碼如下:
// 關閉多模塊訪問 'MULTI_MODULE' => false, 'DEFAULT_MODULE' => 'Home',
可以給相同的用用及模塊綁定多個入口,不同入口文件設置不同的應用模式和綁定模塊,代碼如下:
// 綁定Home模塊到當前入口文件 $_GET['m'] = 'Home'; define('APP_PATH','./Application/'); require './ThinkPHP/ThinkPHP.php';
這樣就可以使用下面的路徑來訪問了http://Servername/thinkphp/home.php/Index
這個home.php里的內容和index.php內容一樣,也是一個入口文件。
