多重模組
在ThinkPHP 3.2.3 中,預設的應用程式目錄是./Application,下面的預設模組是Home 模組,如果此時需要添加一個Admin 模組用於後台應用,在預設的入口文件./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 官方推薦的分組模式。
另外一種設定就是多入口設計,也就是在預設入口檔案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 控制器。
推薦教學:《TP5》
以上是thinkphp配置配置多應用多配置的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!