# 模塊設計
> 5\.1版本默認采用多模塊的架構,并且支持單一模塊設計,所有模塊的命名空間均以`app`作為根命名空間(可通過環境變量更改)。
## 目錄結構
標準的應用和模塊目錄結構如下:
```
├─application 應用目錄(可設置)
│ ├─common 公共模塊目錄(可選)
│ ├─module1 模塊1目錄
│ │ ├─common.php 模塊函數文件
│ │ ├─config 模塊配置目錄(可選)
│ │ ├─controller 控制器目錄
│ │ ├─model 模型目錄(可選)
│ │ ├─view 視圖目錄(可選)
│ │ └─ ... 更多類庫目錄
│ │
│ ├─module2 模塊2目錄
│ │ ├─common.php 模塊函數文件
│ │ ├─config 模塊配置目錄(可選)
│ │ ├─controller 控制器目錄
│ │ ├─model 模型目錄(可選)
│ │ ├─view 視圖目錄(可選)
│ │ └─ ... 更多類庫目錄
```
> 模塊的配置目錄也可以放到外面的config目錄的模塊子目錄下面。
遵循ThinkPHP`5.1`的命名規范,模塊目錄全部采用**小寫和下劃線**命名。
> 模塊名稱請避免使用PHP保留關鍵字(保留字列表參見 <http://php.net/manual/zh/reserved.keywords.php> ),否則會造成系統錯誤。
其中`common`模塊是一個特殊的模塊,默認是禁止直接訪問的,一般用于放置一些公共的類庫用于其他模塊的繼承。
## 模塊類庫
一個模塊下面的類庫文件的命名空間統一以`app\模塊名`開頭,例如:
```
// index模塊的Index控制器類
app\index\controller\Index
// index模塊的User模型類
app\index\model\User
```
## 模塊和控制器隱藏
由于默認是采用多模塊的支持,所以多個模塊的情況下必須在URL地址中標識當前模塊,如果只有一個模塊的話,可以在入口文件中進行模塊綁定:
```
<?php
// [ 應用入口文件 ]
namespace think;
// 加載基礎文件
require __DIR__ . '/../thinkphp/base.php';
// 執行應用并響應(綁定當前訪問到index模塊)
Container::get('app')->bind('index')->run()->send();
```
綁定后,我們的URL訪問地址則變成:
> #### [http://serverName/index.php/控制器/操作/\[參數名/參數值...\]](http://serverName/index.php/%E6%8E%A7%E5%88%B6%E5%99%A8/%E6%93%8D%E4%BD%9C/%5B%E5%8F%82%E6%95%B0%E5%90%8D/%E5%8F%82%E6%95%B0%E5%80%BC...%5D)
訪問的模塊是`index`模塊。
如果你的應用比較簡單,模塊和控制器都只有一個,那么可以在應用公共文件中綁定模塊和控制器,如下:
```
// 綁定當前訪問到index模塊的index控制器
Container::get('app')->bind('index/index')->run()->send();
```
設置后,我們的URL訪問地址則變成:
> #### [http://serverName/index.php/操作/\[參數名/參數值...\]](http://serverName/index.php/%E6%93%8D%E4%BD%9C/%5B%E5%8F%82%E6%95%B0%E5%90%8D/%E5%8F%82%E6%95%B0%E5%80%BC...%5D)
訪問的模塊是`index`模塊,控制器是`Index`控制器。
## 單一模塊
如果你的應用比較簡單,只有唯一一個模塊,那么可以進一步簡化成使用單一模塊結構,方法如下:
首先在應用配置文件中定義:
```
// 關閉多模塊設計
'app_multi_module' => false,
```
然后,調整應用目錄的結構為如下:
```
├─application 應用目錄(可設置)
│ ├─controller 控制器目錄
│ ├─model 模型目錄
│ ├─view 視圖目錄
│ ├─ ... 更多類庫目錄
│ └─common.php 函數文件
```
URL訪問地址變成
> #### [http://serverName/index.php(或者其它應用入口)/控制器/操作/\[參數名/參數值...\]](http://serverName/index.php%EF%BC%88%E6%88%96%E8%80%85%E5%85%B6%E5%AE%83%E5%BA%94%E7%94%A8%E5%85%A5%E5%8F%A3%EF%BC%89/%E6%8E%A7%E5%88%B6%E5%99%A8/%E6%93%8D%E4%BD%9C/%5B%E5%8F%82%E6%95%B0%E5%90%8D/%E5%8F%82%E6%95%B0%E5%80%BC...%5D)
同時,單一模塊設計下的應用類庫的命名空間也有所調整,例如:
原來的
```
app\index\controller\Index
app\index\model\User
```
變成
```
app\controller\Index
app\model\User
```
更多的URL簡化和定制還可以通過URL路由功能實現。
> 單一模塊方式仍然可以通過多級控制器的方式來管理控制器層次
## 空模塊
可以把不存在的模塊訪問統一指向一個空模塊,設置:
```
// 設置空模塊名為home
'empty_module' => 'home',
```
如果訪問了一個不存在的模塊,系統會指向home模塊進行訪問。
> 空模塊只有開啟多模塊訪問,并且沒有綁定模塊的情況下才有效。
## 環境變量
5\.1版本取消了所有的系統常量,原來的系統路徑變量改為使用`Env`類獲取(需要引入`think\facade\Env`):
例如:
```
// 獲取應用目錄(不區分大小寫)
echo Env::get('app_path');
// 或者
echo Env::get('APP_PATH');
```
支持獲取的系統路徑變量包括:
系統路徑Env參數名稱應用根目錄root\_path應用目錄app\_path框架目錄think\_path配置目錄config\_path擴展目錄extend\_pathcomposer目錄vendor\_path運行緩存目錄runtime\_path路由目錄route\_path當前模塊目錄module\_path
- 序言
- 基礎
- 安裝
- 開發規范
- 目錄結構
- 配置
- 架構
- 架構總覽
- 入口文件
- URL訪問
- 模塊設計
- 命名空間
- 容器和依賴注入
- Facade
- 鉤子和行為
- 中間件
- 路由
- 路由定義
- 變量規則
- 路由地址
- 閉包支持
- 路由參數
- 路由緩存
- 跨域請求
- 注解路由
- 路由分組
- MISS路由
- 資源路由
- 快捷路由
- 路由別名
- 路由綁定
- 域名路由
- URL生成
- 控制器
- 控制器定義
- 前置操作
- 跳轉和重定向
- 空操作和空控制器
- 分層控制器
- 資源控制器
- 請求
- 請求對象
- 請求信息
- 輸入變量
- 請求類型
- HTTP頭信息
- 偽靜態
- 參數綁定
- 請求緩存
- 響應
- 響應輸出
- 響應參數
- 重定向
- 數據庫
- 連接數據庫
- 查詢構造器
- 查詢數據
- 添加數據
- 更新數據
- 刪除數據
- 查詢表達式
- 鏈式操作
- 聚合查詢
- 時間查詢
- 高級查詢
- 視圖查詢
- JSON字段
- 子查詢
- 原生查詢
- 查詢事件
- 事務操作
- 監聽SQL
- 存儲過程
- 數據集
- 分布式數據庫
- 模型
- 定義
- 新增
- 更新
- 刪除
- 查詢
- JSON字段
- 獲取器
- 修改器
- 自動時間戳
- 只讀字段
- 軟刪除
- 類型轉換
- 數據完成
- 查詢范圍
- 模型輸出
- 模型事件
- 模型關聯
- 一對一關聯
- 一對多關聯
- 遠程一對多
- 多對多關聯
- 多態關聯
- 關聯預載入
- 關聯統計
- 關聯輸出
- 視圖
- 視圖渲染
- 視圖賦值
- 視圖過濾
- 模板引擎
- 模板
- 變量輸出
- 使用函數
- 運算符
- 原樣輸出
- 模板注釋
- 模板布局
- 模板繼承
- 包含文件
- 輸出替換
- 標簽庫
- 內置標簽
- 循環標簽
- 比較標簽
- 條件判斷
- 資源文件加載
- 標簽嵌套
- 原生PHP
- 定義標簽
- 標簽擴展
- 錯誤和日志
- 異常處理
- 日志處理
- 調試
- 調試模式
- Trace調試
- 性能調試
- SQL調試
- 變量調試
- 遠程調試
- 驗證
- 驗證器
- 驗證規則
- 錯誤信息
- 驗證場景
- 路由驗證
- 內置規則
- 獨立驗證
- 靜態調用
- 表單令牌
- 雜項
- 緩存
- Session
- Cookie
- 多語言
- 分頁
- 上傳
- 命令行
- 啟動內置服務器
- 自動生成目錄結構
- 創建類庫文件
- 生成類庫映射文件
- 清除緩存文件
- 生成配置緩存文件
- 生成數據表字段緩存
- 生成路由映射緩存
- 自定義指令
- 擴展庫
- 驗證碼
- 圖像處理
- Time
- 數據庫遷移工具
- Workerman
- MongoDb
- 單元測試
- 安全和性能
- 安全建議
- 優化建議
- 附錄
- 助手函數
- 升級指導
- 更新日志