## 多應用
安裝后默認使用**單應用模式部署**,目錄結構如下:
~~~
├─app 應用目錄
│ ├─controller 控制器目錄
│ ├─model 模型目錄
│ ├─view 視圖目錄
│ └─ ... 更多類庫目錄
│
├─public WEB目錄(對外訪問目錄)
│ ├─index.php 入口文件
│ ├─router.php 快速測試文件
│ └─.htaccess 用于apache的重寫
│
├─view 視圖目錄
├─config 應用配置目錄
├─route 路由定義目錄
├─runtime 應用的運行時目錄
~~~
>[info] 單應用模式的優勢是簡單靈活,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
~~~
>[info] 也就是說`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()` |
> 注意:應用支持使用`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']
~~~
> 多應用模式并非核心內置模式,官方提供的多應用擴展更多是拋磚引玉,你完全可以通過中間件來擴展適合自己的多應用模式
## URL設計
`6.0`的URL訪問受路由影響,如果在沒有定義或匹配路由的情況下(并且沒有開啟強制路由模式的話),則是基于:
~~~
http://serverName/index.php(或者其它入口文件)/控制器/操作/參數/值…
~~~
如果使用自動多應用模式的話,URL一般是
~~~
http://serverName/index.php/應用/控制器/操作/參數/值...
~~~
> 普通模式的URL訪問不再支持,但參數可以支持普通方式傳值
如果不支持PATHINFO的服務器可以使用兼容模式訪問如下:
~~~
http://serverName/index.php?s=/控制器/操作/[參數名/參數值...]
~~~
## URL重寫
可以通過URL重寫隱藏應用的入口文件`index.php`(也可以是其它的入口文件,但URL重寫通常只能設置一個入口文件),下面是相關服務器的配置參考:
### \[ Apache \]
1. `httpd.conf`配置文件中加載了`mod_rewrite.so`模塊
2. `AllowOverride None`將`None`改為`All`
3. 把下面的內容保存為`.htaccess`文件放到應用入口文件的同級目錄下
~~~
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
~~~
### \[ IIS \]
如果你的服務器環境支持`ISAPI_Rewrite`的話,可以配置`httpd.ini`文件,添加下面的內容:
~~~
RewriteRule (.*)$ /index\.php\?s=$1 [I]
~~~
在IIS的高版本下面可以配置`web.Config`,在中間添加`rewrite`節點:
~~~
<rewrite>
<rules>
<rule name="OrgPage" stopProcessing="true">
<match url="^(.*)$" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" pattern="^(.*)$" />
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="index.php/{R:1}" />
</rule>
</rules>
</rewrite>
~~~
### \[ Nginx \]
在Nginx低版本中,是不支持PATHINFO的,但是可以通過在`Nginx.conf`中配置轉發規則實現:
~~~
location / { // …..省略部分代碼
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
}
}
~~~
> 其實內部是轉發到了ThinkPHP提供的兼容URL,利用這種方式,可以解決其他不支持PATHINFO的WEB服務器環境。
- 空白目錄
- php語法結構
- 安裝與更新
- 開啟調試模式及代碼跟蹤器
- 架構
- 源碼分析
- 應用初始化
- 請求流程
- 中間件源碼分析
- 請求處理源碼分析
- Request源碼分析
- 模板編譯流程
- 路由與請求流程
- 容器
- 獲取目錄位置
- 入口文件
- 多應用模式及URL訪問
- 依賴注入與容器
- 容器屬性及方法
- Container
- App
- facade
- 中間件(middleware)
- 系統服務
- extend 擴展類庫
- 筆記
- 配置
- env配置定義及獲取
- 配置文件的配置獲取
- 單應用模式-(配置)文件目錄結構(默認)
- 多應用模式(配置)文件目錄結構(配置文件)
- 配置文件
- 應用配置:app.php
- 緩存配置: cache.php
- 數據庫配置:database.php
- 路由和URL配置:route.php
- Cookie配置:cookie.php
- Session配置:session.php
- 命令行配置:console.php
- 多語言配置:lang.php
- 日志配置:log.php
- 頁面Trace配置:trace.php
- 磁盤配置: filesystem.php
- 中間件配置:middleware.php
- 視圖配置:view.php
- 改成用yaconf配置
- 事件
- 例子:省略事件類的demo
- 例子2:完整事件類
- 例子3:事件訂閱,監聽多個事件
- 解析
- 路由
- 路由定義
- 路由地址
- 變量規則
- MISS路由
- URL生成
- 閉包支持
- 路由參數
- 路由中間件
- 路由分組
- 資源路由
- 注解路由
- 路由綁定
- 域名路由
- 路由緩存
- 跨域路由
- 控制器
- 控制器定義
- 空控制器、空操作
- 空模塊處理
- RESTFul資源控制器
- 控制器中間件
- 請求對象Request(url參數)
- 請求信息
- 獲取輸入變量($_POST、$_GET等)
- 請求類型的獲取與偽裝
- HTTP頭信息
- 偽靜態
- 參數綁定
- 請求緩存
- 響應對象Response
- 響應輸出
- 響應參數
- 重定向
- 文件下載
- 錯誤頁面的處理辦法
- 應用公共文件common.php
- 模型
- 模型定義及常規屬性
- 模型數據獲取與模型賦值
- 查詢
- 數據集
- 增加
- 修改
- 刪除
- 條件
- 查詢范圍scope
- 獲取器
- 修改器
- 搜索器
- 軟刪除
- 模型事件
- 關聯預載入
- 模型關聯
- 一對一關聯
- 一對多關聯
- 多對多關聯
- 自動時間戳
- 事務
- 數據庫
- 查詢構造器
- 查詢合集
- 子查詢
- 聚合查詢
- 時間查詢
- 視圖查詢(比join簡單)
- 獲取查詢參數
- 快捷方法
- 動態查詢
- 條件查詢
- 打印sql語句
- 增
- 刪
- 改
- 查
- 鏈式操作
- 查詢表達式
- 分頁查詢
- 原生查詢
- JSON字段
- 鏈接數據庫配置
- 分布式數據庫
- 查詢事件
- Db獲取器
- 事務操作
- 存儲過程
- Db數據集
- 數據庫驅動
- 視圖
- 模板
- 模板配置
- 模板位置
- 模板渲染
- 模板變量與賦值(assign)
- 模板輸出替換
- url生成
- 模板詳解
- 內置標簽
- 三元運算
- 變量輸出
- 函數輸出
- Request請求參數
- 模板注釋及原樣輸出
- 模板繼承
- 模板布局
- 原生PHP
- 模板引擎
- 視圖過濾
- 視圖驅動
- 驗證
- 驗證進階之最終版
- 錯誤和日志
- 異常處理
- 日志處理
- 調試
- 調試模式
- Trace調試
- SQL調試
- 變量調試
- 遠程調試
- 雜項
- 緩存
- Session
- Cookie
- 多語言
- 上傳
- 擴展說明
- N+1查詢
- TP類庫
- 擴展類庫
- 數據庫遷移工具
- Workerman
- think助手工具庫
- 驗證碼
- Swoole
- request
- app
- Response
- View
- Validate
- Config
- 命令行
- 助手函數
- 升級指導(功能的添加與刪除說明)
- siyucms
- 開始
- 添加頁面流程
- 列表頁加載流程
- 彈出框
- 基礎控制器
- 基礎模型
- 快速構建
- 表單form構建
- 表格table構建
- MakeBuilder
- 前端組件
- 日期組件
- layer 彈層組件
- Moment.js 日期處理插件
- siyucms模板布局
- 函數即其變量
- 前端頁面
- $.operate.方法
- $.modal.方法:彈出層
- $.common.方法:通用方法
- 被cms重寫的表格options
- 自定義模板
- 搜索框
- 自定義form表單
- 獲取表單搜索參數并組裝為url字符串