# 模塊化設計
[上一頁](# "上一頁")[下一頁](# "下一頁")
一個完整的ThinkPHP應用基于**模塊/控制器/操作**設計,并且,如果有需要的話,可以支持多入口文件和多級控制器。
ThinkPHP3.2采用模塊化的架構設計思想,對目錄結構規范做了調整,可以支持多模塊應用的創建,讓應用的擴展更加方便。
一個典型的URL訪問規則是(我們以默認的PATHINFO模式為例說明,當然也可以支持普通的URL模式):
~~~
http://serverName/index.php(或者其他應用入口文件)/模塊/控制器/操作/[參數名/參數值...]
~~~
ThinkPHP3.2的應用可以支持切換到命令行訪問,如果切換到命令行模式下面的訪問規則是:
~~~
>php.exe index.php(或其它應用入口文件) 模塊/控制器/操作/[參數名/參數值...]
~~~
解釋下其中的幾個概念:
| 名稱 | 描述 |
|-----|-----|
| 應用 | 基于同一個入口文件訪問的項目我們稱之為一個應用。 |
| 模塊 | 一個應用下面可以包含多個模塊,每個模塊在應用目錄下面都是一個獨立的子目錄。 |
| 控制器 | 每個模塊可以包含多個控制器,一個控制器通常體現為一個控制器類。 |
| 操作 | 每個控制器類可以包含多個操作方法,也可能是綁定的某個操作類,每個操作是URL訪問的最小單元。 |
> 模塊化設計的思想下面模塊是最重要的部分,模塊其實是一個包含配置文件、函數文件和MVC文件(目錄)的集合。
### 模塊設計
新版采用模塊化的設計架構,下面是一個應用目錄下面的模塊目錄結構,每個模塊可以方便的卸載和部署,并且支持公共模塊。
~~~
Application 默認應用目錄(可以設置)
├─Common 公共模塊(不能直接訪問)
├─Home 前臺模塊
├─Admin 后臺模塊
├─... 其他更多模塊
├─Runtime 默認運行時目錄(可以設置)
~~~
> 注意:3.2版本在原來3.1.3的獨立分組的基礎上進行了改進,改進后的獨立分組就是新版的模塊,之前的模塊則改稱為控制器。 默認情況下,只要應用目錄下面存在模塊目錄,該模塊就可以訪問,只有當你希望禁止某些模塊或者僅允許模塊訪問的時候才需要進行模塊列表的相關設置。
每個模塊是相對獨立的,其目錄結構如下:
~~~
├─Module 模塊目錄
│ ├─Conf 配置文件目錄
│ ├─Common 公共函數目錄
│ ├─Controller 控制器目錄
│ ├─Model 模型目錄
│ ├─Logic 邏輯目錄(可選)
│ ├─Service Service目錄(可選)
│ ... 更多分層目錄可選
│ └─View 視圖目錄
~~~
> 由于采用多層的MVC機制,除了Conf和Common目錄外,每個模塊下面的目錄結構可以根據需要靈活設置和添加,所以并不拘泥于上面展現的目錄
### 公共模塊
Common模塊是一個特殊的模塊,是應用的公共模塊,訪問所有的模塊之前都會首先加載公共模塊下面的配置文件(`Conf/config.php`)和公共函數文件(`Common/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 框架目錄
~~~
> 定義之后,Application目錄下面就不再需要Common目錄了。
### 自動生成模塊目錄
從**3.2.2版本**開始,可以支持自動生成默認模塊之外的模塊目錄以及批量生成控制器和模型類。
例如,如果我們需要生成一個Admin模塊用于后臺應用,在應用入口文件中定義如下:
~~~
// 綁定Admin模塊到當前入口文件
define('BIND_MODULE','Admin');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
~~~
然后訪問URL地址
~~~
http://serverName/index.php
~~~
就會生成Admin模塊的目錄,并生成一個默認的控制器類`Admin\Controller\IndexController`。如果需要生成更多的控制器類,可以定義`BUILD_CONTROLLER_LIST`常量,例如:
~~~
// 綁定Admin模塊到當前入口文件
define('BIND_MODULE','Admin');
define('BUILD_CONTROLLER_LIST','Index,User,Menu');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
~~~
訪問后會自動生成三個指定的控制器類:
~~~
Admin\Controller\IndexController
Admin\Controller\UserController
Admin\Controller\MenuController
~~~
> 注意:默認生成的控制器類都是繼承`Think\Controller`,如果需要繼承其他的公共類需要另外調整。 如果在應用的公共配置文件中設置關閉了 `APP_USE_NAMESPACE`的話,生成的控制器類則不會采用命名空間定義。
還可以自己手動調用`Think\Build`類的方法來生成控制器類,例如:
~~~
// 生成Admin模塊的Role控制器類
// 默認類庫為Admin\Controller\RoleController
// 如果已經存在則不會重新生成
\Think\Build::buildController('Admin','Role');
~~~
同樣,也可以定義`BUILD_MODEL_LIST`支持生成多個模型類:
~~~
// 綁定Admin模塊到當前入口文件
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';
~~~
訪問會自動生成模型類:
~~~
Admin\Model\UserModel
Admin\Model\MenuModel
~~~
> 注意:默認生成的模型類都是繼承`Think\Model`,如果需要繼承公共的模型類需要另外調整。 如果在應用的公共配置文件中設置關閉了 `APP_USE_NAMESPACE`的話,生成的模型類則不會采用命名空間定義。
也可以自己手動調用Think\Build類的方法來生成模型類,例如:
~~~
// 生成Admin模塊的Role模型類
// 默認類庫為Admin\Model\RoleModel
// 如果已經存在則不會重新生成
\Think\Build::buildModel('Admin','Role');
~~~
### 禁止訪問模塊
3.2對模塊的訪問是自動判斷的,所以通常情況下無需配置模塊列表即可訪問,但可以配置禁止訪問的模塊列表(用于被其他模塊調用或者不開放訪問),默認配置中是禁止訪問`Common`模塊和`Runtime`模塊(Runtime目錄是默認的運行時目錄),我們可以增加其他的禁止訪問模塊列表:
~~~
// 設置禁止訪問的模塊列表
'MODULE_DENY_LIST' => array('Common','Runtime','Api'),
~~~
設置后,Api模塊不能通過URL直接訪問,事實上,可能我們只是在該模塊下面放置一些公共的接口文件,因此都是內部調用即可。
### 設置訪問列表
如果你的應用下面模塊比較少,還可以設置允許訪問列表和默認模塊,這樣可以簡化默認模塊的URL訪問。
~~~
'MODULE_ALLOW_LIST' => array('Home','Admin','User'),
'DEFAULT_MODULE' => 'Home',
~~~
設置之后,除了Home、Admin和User模塊之外的模塊都不能被直接訪問,并且Home模塊是默認訪問模塊(可以不出現在URL地址)。
### 單模塊設計
如果你的應用夠簡單,那么也許僅僅用一個模塊就可以完成,那么可以直接設置:
~~~
// 關閉多模塊訪問
'MULTI_MODULE' => false,
'DEFAULT_MODULE' => 'Home',
~~~
一旦關閉多模塊訪問后,就只能訪問默認模塊(這里設置的是Home)。
> 單模塊設計后公共模塊依然有效
### 多入口設計
可以給相同的應用及模塊設置多個入口,不同的入口文件可以設置不同的應用模式或者綁定模塊。
例如,我們在`index.php`文件的同級目錄新增一個`home.php`入口文件,并綁定Home模塊:
**3.2.0版本寫法:**
~~~
// 綁定Home模塊到當前入口文件
$_GET['m'] = 'Home';
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
~~~
**3.2.1以上版本寫法:**
~~~
// 綁定Home模塊到當前入口文件
define('BIND_MODULE','Home');
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
~~~
> 如果你更改了系統默認的變量設置,則需要做對應的模塊綁定的變量調整。
綁定模塊后,原來的訪問地址
~~~
http://serverName/index.php/Home/Index/index
~~~
就變成
~~~
http://serverName/home.php/Index/index
~~~
同樣的方式,我們也可以在入口文件中綁定控制器,例如:
**3.2.0版本寫法:**
~~~
$_GET['m'] = 'Home'; // 綁定Home模塊到當前入口文件
$_GET['c'] = 'Index'; // 綁定Index控制器到當前入口文件
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
~~~
**3.2.1以上版本寫法:**
~~~
define('BIND_MODULE', 'Home'); // 綁定Home模塊到當前入口文件
define('BIND_CONTROLLER','Index'); // 綁定Index控制器到當前入口文件
define('APP_PATH','./Application/');
require './ThinkPHP/ThinkPHP.php';
~~~
綁定模塊和控制器后,原來的訪問地址:
~~~
http://serverName/index.php/Home/Index/index
~~~
就變成:
~~~
http://serverName/home.php/index
~~~
> 不同的入口文件還可以用于綁定不同的應用模式,參考[應用模式](#)部分。
[上一頁](# "上一頁")[下一頁](# "下一頁")
- 序言
- 基礎
- 獲取ThinkPHP
- 環境要求
- 目錄結構
- 入口文件
- 自動生成
- 模塊
- 控制器
- 開發規范
- 配置
- 配置格式
- 配置加載
- 讀取配置
- 動態配置
- 擴展配置
- 批量配置
- 架構
- 模塊化設計
- URL模式
- 多層MVC
- CBD模式
- 命名空間
- 自動加載
- 應用模式
- 項目編譯
- 系統流程
- 路由
- 路由定義
- 規則路由
- 正則路由
- 靜態路由
- 閉包支持
- 實例說明
- 控制器
- 控制器定義
- 前置和后置操作
- Action參數綁定
- 偽靜態
- URL大小寫
- URL生成
- AJAX返回
- 跳轉和重定向
- 輸入變量
- 請求類型
- 空操作
- 空控制器
- 操作綁定到類
- 模型
- 模型定義
- 模型實例化
- 字段定義
- 連接數據庫
- 切換數據庫
- 分布式數據庫支持
- 連貫操作
- WHERE
- TABLE
- ALIAS
- DATA
- FIELD
- ORDER
- LIMIT
- PAGE
- GROUP
- HAVING
- JOIN
- UNION
- DISTINCT
- LOCK
- CACHE
- COMMENT
- RELATION
- 命名范圍
- CURD操作
- 數據創建
- 數據寫入
- 數據讀取
- 數據更新
- 數據刪除
- ActiveRecord
- 字段映射
- 查詢語言
- 查詢方式
- 表達式查詢
- 快捷查詢
- 區間查詢
- 組合查詢
- 統計查詢
- SQL查詢
- 動態查詢
- 子查詢
- 自動驗證
- 自動完成
- 參數綁定
- 虛擬模型
- 模型分層
- 視圖模型
- 關聯模型
- 高級模型
- Mongo模型
- 視圖
- 模板定義
- 模板主題
- 模板賦值
- 模板渲染
- 獲取模板地址
- 獲取內容
- 模板引擎
- 模板
- 變量輸出
- 系統變量
- 使用函數
- 默認值輸出
- 使用運算符
- 標簽庫
- 模板繼承
- 修改定界符
- 三元運算
- 包含文件
- 內置標簽
- Volist標簽
- Foreach標簽
- For標簽
- Switch標簽
- 比較標簽
- 范圍判斷標簽
- IF標簽
- Present標簽
- Empty標簽
- Defined標簽
- Assign標簽
- Define標簽
- 標簽嵌套
- import標簽
- 使用PHP代碼
- 原樣輸出
- 模板注釋
- 模板布局
- 模板替換
- 調試
- 調試模式
- 異常處理
- 日志記錄
- 頁面Trace
- Trace方法
- 變量調試
- 性能調試
- 錯誤調試
- 模型調試
- 緩存
- 數據緩存
- 快速緩存
- 查詢緩存
- SQL解析緩存
- 靜態緩存
- 安全
- 輸入過濾
- 表單合法性檢測
- 表單令牌
- 防止SQL注入
- 目錄安全文件
- 保護模板文件
- 上傳安全
- 防止XSS攻擊
- 其他安全建議
- 擴展
- 類庫擴展
- 驅動擴展
- 緩存驅動
- 數據庫驅動
- 日志驅動
- Session驅動
- 存儲驅動
- 模板引擎驅動
- 標簽庫驅動
- 行為擴展
- 標簽擴展
- Widget擴展
- 應用模式
- 部署
- PATH_INFO支持
- URL重寫
- 模塊部署
- 域名部署
- 入口綁定
- 替換入口
- 專題
- SESSION支持
- Cookie支持
- 多語言支持
- 數據分頁
- 文件上傳
- 驗證碼
- 圖像處理
- RESTFul
- RPC
- SAE
- IP獲取和定位
- 附錄
- 常量參考
- 配置參考
- 升級指導
- 更新日志
- 鳴謝
- 關于