多模塊
在 ThinkPHP 3.2.3 中,默認的應用目錄是 ./Application,下面的默認模塊是 Home 模塊,如果此時需要添加一個 Admin 模塊用於后台應用,根據手冊 http://www.kancloud.cn/manual/thinkphp/1696 中 “自動生成模塊目錄” 的部分的說明,在默認的入口文件 ./index.php 中添加:
// 綁定Admin模塊到當前入口文件 define('BIND_MODULE','Admin');
此時運行 http://serverNmae/index.php,會在 ./Application 目錄下生成一個 Admin 模塊。但是此時訪問 http://serverName/index.php,實際上訪問的是新添加的 Admin 模塊,即使在 ./Applicaition/Common/Conf/config.php 中添加
//設置默認模塊 'DEFAULT_MODULE' => 'Home'
也無法正確定位到 Home 模塊。
實際上手冊中提到到的在入口文件定義 BIND_MODULE 的實際含義是定義默認模塊。參見:./ThinkPHP/Library/Think/Dispatcher.calss.php,該文件定義了 ThinkPHP 內置的 Dispatcher 類,用於完成 URL 解析、路由和調度(參見手冊中的 ”系統流程“ 一節),其中 Line:140
// 獲取模塊名稱 define('MODULE_NAME', defined('BIND_MODULE')? BIND_MODULE : self::getModule($varModule));
在靜態方法 dispatch 中,模塊名稱的獲取首先會在入口文件中查詢是否有定義 BIND_MODULE,如果有定義,則定義 MODULE_NAME 的值為定義的 BIND_MODULE 的值,否則調用該類中的靜態私有方法 getModule 來獲取實際的模塊名稱:
/** * 獲得實際的模塊名稱 */ static private function getModule($var) { $module = (!empty($_GET[$var])?$_GET[$var]:C('DEFAULT_MODULE')); unset($_GET[$var]); if($maps = C('URL_MODULE_MAP')) { if(isset($maps[strtolower($module)])) { // 記錄當前別名 define('MODULE_ALIAS',strtolower($module)); // 獲取實際的模塊名 return ucfirst($maps[MODULE_ALIAS]); }elseif(array_search(strtolower($module),$maps)){ // 禁止訪問原始模塊 return ''; } } return strip_tags(ucfirst(strtolower($module))); }
該方法中,如果 URL 中不包含配置文件重定義的 VAR_MODULE (默認為 m,在 ./ThinkPHP/Conf/convention.php 中)的值,則找配置文件中定義的 DEFAULT_MODULE 的值。
通過以上分析,得出 BIND_MODULE 實際上是定義默認模塊,如果在項目中有多個模塊的話,不要這樣配置。
如果此時注釋默認入口文件 ./index.php 中的 BIND_MODULE(即采用默認的入口文件配置),那么直接訪問 http://serverName/admin 就可以訪問 Admin 模塊,因為在該入口文件中,定義了應用目錄 ./Application,那么訪問 http://serverName/admin 實際就是訪問了 ./Application/Admin/Controller/IndexController.class.php 中的 index 方法。ThinkPHP 3.2.3 采用這種方式配置多模塊就可以了,無需在入口文件和配置文件中另作定義,這也是 ThinkPHP 官方推薦的分組模式。
另外一種配置就是多入口設計(參見手冊 http://www.kancloud.cn/manual/thinkphp/1696),即在默認入口文件 index.php 的同級創建 admin.php ,同時在 index.php 中添加:
// 綁定Home模塊到當前入口文件 define('BIND_MODULE','Home');
在 admin.php 中采用和 index.php 相同的配置,除了 BIND_MODULE 的定義,將 BIND_MODULE 的定義改為:
// 綁定Admin模塊到當前入口文件 define('BIND_MODULE','Admin');
然后在應用配置文件 ./Application/Common/Conf/config.php 中添加:
//設置默認模塊 'DEFAULT_MODULE' => 'Home',
此時訪問 http://serverName/index.php 就能訪問 Home 模塊,訪問 http://servername/admin.php ,就能訪問 Admin 模塊,而無法訪問 http://serverName/admin ,因為此時 index.php 只能訪問 Home 模塊。
多應用
通常情況下 ThinkPHP 3.2.3 無需使用多應用模式,因為大多數情況下都可以通過多模塊化以及多入口的設計來解決應用的擴展需求。
如果一定要使用多應用模式,例如創建應用 Application_API,那么可以在 ./Application 同級目錄下創建目錄 Applicaiton_API,同時增加入口文件 ./api.php,將應用目錄指向 ./Application_API:
// 定義應用目錄 define('APP_PATH','./Application_API/');
注意初始情況下新增加的應用一定要有 Home 模塊,即使在 ./Application_API/Common/Conf/config.php 中設置了
//設置默認模塊 'DEFAULT_MODULE' => 'Api',
也許要初始有 Home 模塊,否則會報錯:無法加載 Index 控制器。