## 多應用
安裝后默認使用**單應用模式部署**,目錄結構如下:
~~~
├─app 應用目錄
│ ├─controller 控制器目錄
│ ├─model 模型目錄
│ ├─view 視圖目錄
│ └─ ... 更多類庫目錄
│
├─public WEB目錄(對外訪問目錄)
│ ├─index.php 入口文件
│ ├─router.php 快速測試文件
│ └─.htaccess 用于apache的重寫
│
├─view 視圖目錄
├─config 應用配置目錄
├─route 路由定義目錄
├─runtime 應用的運行時目錄
~~~
> 單應用模式的優勢是簡單靈活,URL地址完全通過路由可控。配合路由分組功能可以實現類似多應用的靈活機制。
>[danger] 如果要使用多應用模式,你需要安裝多應用模式擴展`think-multi-app`。
```
composer require topthink/think-multi-app
```
然后你的應用目錄結構需要做如下調整,主要區別在`app`目錄增加了應用子目錄,然后配置文件和路由定義文件都納入應用目錄下。
~~~
├─app 應用目錄
│ ├─index 主應用
│ │ ├─controller 控制器目錄
│ │ ├─model 模型目錄
│ │ ├─view 視圖目錄
│ │ ├─config 配置目錄
│ │ ├─route 路由目錄
│ │ └─ ... 更多類庫目錄
│ │
│ ├─admin 后臺應用
│ │ ├─controller 控制器目錄
│ │ ├─model 模型目錄
│ │ ├─view 視圖目錄
│ │ ├─config 配置目錄
│ │ ├─route 路由目錄
│ │ └─ ... 更多類庫目錄
│
├─public WEB目錄(對外訪問目錄)
│ ├─admin.php 后臺入口文件
│ ├─index.php 入口文件
│ ├─router.php 快速測試文件
│ └─.htaccess 用于apache的重寫
│
├─config 全局應用配置目錄
├─runtime 運行時目錄
│ ├─index index應用運行時目錄
│ └─admin admin應用運行時目錄
~~~
從目錄結構可以看出來,每個應用相對保持獨立,并且可以支持多個入口文件,應用下面還可以通過多級控制器來維護控制器分組。
## 自動多應用部署
支持在同一個入口文件中訪問多個應用,并且支持應用的映射關系以及自定義。如果你通過`index.php`入口文件訪問的話,并且沒有設置應用`name`,系統自動采用自動多應用模式。
自動多應用模式的URL地址默認使用
~~~
// 訪問admin應用
http://serverName/index.php/admin
// 訪問shop應用
http://serverName/index.php/shop
~~~
> 也就是說`pathinfo`地址的第一個參數就表示當前的應用名,后面才是該應用的路由或者控制器/操作。
如果直接訪問
~~~
http://serverName/index.php
~~~
訪問的其實是`index`默認應用,可以通過`app.php`配置文件的`default_app`配置參數指定默認應用。
~~~
// 設置默認應用名稱
'default_app' => 'home',
~~~
接著訪問
~~~
http://serverName/index.php
~~~
其實訪問的是`home`應用。
>[danger] 自動多應用模式下,路由是每個應用獨立的,所以你沒法省略URL里面的應用參數。但可以使用域名綁定解決。
## 多應用智能識別
如果沒有綁定入口或者域名的情況下,URL里面的應用不存在,例如訪問:
```
http://serverName/index.php/think
```
假設并不存在`think`應用,這個時候系統會自動切換到單應用模式,如果有定義全局的路由,也會進行路由匹配檢查。
如果我們在`route/route.php`全局路由中定義了:
```
Route::get('think', function () {
return 'hello,ThinkPHP!';
});
```
訪問上面的URL就會輸出
~~~
hello,ThinkPHP!
~~~
如果你希望`think`應用不存在的時候,直接訪問默認應用的路由,可以在`app.php`中配置
```
// 開啟應用快速訪問
'app_express' => true,
// 默認應用
'default_app' => 'home',
```
這個時候就會訪問`home`應用下的路由。
## 增加應用入口
允許為每個應用創建單獨的入口文件而不通過`index.php`入口文件訪問多個應用,例如創建一個`admin.php`入口文件來訪問`admin`應用。
~~~
// [ 應用入口文件 ]
namespace think;
require __DIR__ . '/../vendor/autoload.php';
// 執行HTTP應用并響應
$http = (new App())->http;
$response = $http->run();
$response->send();
$http->end($response);
~~~
> 多應用使用不同的入口的情況下,每個入口文件的內容都是一樣的,默認入口文件名(不含后綴)就是應用名。
使用下面的方式訪問`admin`應用
~~~
http://serverName/admin.php
~~~
如果你的入口文件名和應用不一致,例如你的后臺`admin`應用,入口文件名使用了`test.php`,那么入口文件需要改成:
~~~
// [ 應用入口文件 ]
namespace think;
require __DIR__ . '/../vendor/autoload.php';
// 執行HTTP應用并響應
$http = (new App())->http;
$response = $http->name('admin')->run();
$response->send();
$http->end($response);
~~~
## 獲取當前應用
如果需要獲取當前的應用名,可以使用
```
app('http')->getName();
```
## 應用目錄獲取
單應用和多應用模式會影響一些系統路徑的值,為了更好的理解本手冊的內容,你可能需要理解下面幾個系統路徑所表示的位置。
| 目錄位置 | 目錄說明 | 獲取方法(助手函數) |
| --- | --- | --- |
| 根目錄 | 項目所在的目錄,默認自動獲取,可以在入口文件實例化`App`類的時候傳入。 | `root_path()` |
| 基礎目錄 | 根目錄下的`app`目錄 | `base_path()` |
| 應用目錄 | 當前應用所在的目錄,如果是單應用模式則同基礎目錄,如果是多應用模式,則是`app`/應用子目錄 | `app_path()` |
| 配置目錄 | 根目錄下的`config`目錄 | `config_path()` |
| 運行時目錄 | 框架運行時的目錄,單應用模式就是根目錄的`runtime`目錄,多應用模式為`runtime`/應用子目錄 | `runtime_path()` |
>[danger] 注意:應用支持使用`composer`包,這個時候目錄可能是`composer`包的類庫所在目錄。
對于非自動多應用部署的情況,如果要加載`composer`應用,需要在入口文件中設置應用路徑:
~~~
// [ 應用入口文件 ]
namespace think;
require __DIR__ . '/../vendor/autoload.php';
// 執行HTTP應用并響應
$http = (new App())->http;
$response = $http->path('path/to/app')->run();
$response->send();
$http->end($response);
~~~
## 應用映射
自動多應用模式下,支持應用的別名映射,例如:
~~~
'app_map' => [
'think' => 'admin', // 把admin應用映射為think
],
~~~
應用映射后,原來的應用名將不能被訪問,例如上面的`admin`應用不能直接訪問,只能通過`think`應用訪問。
應用映射支持泛解析,例如:
~~~
'app_map' => [
'think' => 'admin',
'home' => 'index',
'*' => 'index',
],
~~~
表示如果URL訪問的應用不在當前設置的映射里面,則自動映射為`index`應用。
如果要使用`composer`加載應用,需要設置
```
'app_map' => [
'think' => function($app) {
$app->http->path('path/to/composer/app');
},
],
```
## 域名綁定應用
如果你的多應用使用多個子域名或者獨立域名訪問,你可以在`config/app.php`配置文件中定義域名和應用的綁定。
~~~
'domain_bind' => [
'blog' => 'blog', // blog子域名綁定到blog應用
'shop.tp.com' => 'shop', // 完整域名綁定
'*' => 'home', // 二級泛域名綁定到home應用
],
~~~
## 禁止應用訪問
你如果不希望某個應用通過URL訪問,例如,你增加了一個`common`子目錄用于放置一些公共類庫,你可以設置
```
'deny_app_list' => ['common']
```
>[danger] 多應用模式并非核心內置模式,官方提供的多應用擴展更多是拋磚引玉,你完全可以通過中間件來擴展適合自己的多應用模式
- 序言
- 基礎
- 安裝
- 開發規范
- 目錄結構
- 配置
- 架構
- 請求流程
- 架構總覽
- 入口文件
- 多應用模式
- URL訪問
- 容器和依賴注入
- 服務
- 門面
- 中間件
- 事件
- 路由
- 路由定義
- 變量規則
- 路由地址
- 路由參數
- 路由中間件
- 路由分組
- 資源路由
- 注解路由
- 路由綁定
- 域名路由
- MISS路由
- 跨域請求
- URL生成
- 控制器
- 控制器定義
- 基礎控制器
- 空控制器
- 資源控制器
- 控制器中間件
- 請求
- 請求對象
- 請求信息
- 輸入變量
- 請求類型
- HTTP頭信息
- 偽靜態
- 參數綁定
- 請求緩存
- 響應
- 響應輸出
- 響應參數
- 重定向
- 文件下載
- 數據庫
- 連接數據庫
- 分布式數據庫
- 查詢構造器
- 查詢數據
- 添加數據
- 更新數據
- 刪除數據
- 查詢表達式
- 鏈式操作
- where
- table
- alias
- field
- strict
- limit
- page
- order
- group
- having
- join
- union
- distinct
- lock
- cache
- cacheAlways
- comment
- fetchSql
- force
- partition
- failException
- sequence
- replace
- extra
- duplicate
- procedure
- 聚合查詢
- 分頁查詢
- 時間查詢
- 高級查詢
- 視圖查詢
- JSON字段
- 子查詢
- 原生查詢
- 獲取查詢參數
- 查詢事件
- 獲取器
- 事務操作
- 存儲過程
- 數據集
- 數據庫驅動
- 模型
- 定義
- 模型字段
- 新增
- 更新
- 刪除
- 查詢
- 查詢范圍
- JSON字段
- 獲取器
- 修改器
- 搜索器
- 數據集
- 自動時間戳
- 只讀字段
- 軟刪除
- 類型轉換
- 模型輸出
- 模型事件
- 模型關聯
- 一對一關聯
- 一對多關聯
- 遠程一對多
- 遠程一對一
- 多對多關聯
- 多態關聯
- 關聯預載入
- 關聯統計
- 關聯輸出
- 虛擬模型
- 視圖
- 模板變量
- 視圖過濾
- 模板渲染
- 模板引擎
- 視圖驅動
- 錯誤和日志
- 異常處理
- 日志處理
- 調試
- 調試模式
- Trace調試
- SQL調試
- 變量調試
- 遠程調試
- 驗證
- 驗證器
- 驗證規則
- 錯誤信息
- 驗證場景
- 路由驗證
- 內置規則
- 表單令牌
- 注解驗證
- 雜項
- 緩存
- Session
- Cookie
- 多語言
- 上傳
- 命令行
- 啟動內置服務器
- 查看版本
- 自動生成應用目錄
- 創建類庫文件
- 清除緩存文件
- 生成數據表字段緩存
- 生成路由映射緩存
- 輸出路由定義
- 自定義指令
- Debug輸出級別
- 擴展庫
- 數據庫遷移工具
- Workerman
- think助手工具庫
- 驗證碼
- Swoole
- 附錄
- 助手函數
- 升級指導
- 更新日志