系統多應用模式
多重應用程式
預設安裝後使用單一應用模式部署,目錄結構如下:
├─app 應用程式目錄
│ ├─controller 控制器目錄
│ ├─model │ └─ ... 更多類別函式庫目錄
│ ├─public WEB目錄(外部存取目錄)
│ ├─index.php │ └─.htaccess用於apache的重寫
│ ├─view 視圖目錄
├─config #├─runtime 應用的運作時目錄
#單應用模式的優點是簡單靈活,URL位址完全透過路由可控。配合路由分組功能可以實現類似多應用的靈活機制。
如果要使用多應用程式模式,你需要安裝多應用程式模式擴充think-multi-app。
composer require topthink/think-multi-app
然後你的應用程式目錄結構需要做如下調整(主要差異在app目錄)。
├─app 應用目錄
│ ├─index 主應用
│ │ ├#controle 1071 模型目錄
│ │ ├─view 視圖目錄
│ │ ├─config # 配置目錄(優先) 更多類別庫目錄
│ ├─admin 後台應用
│ │ ├ ─controller 控制器目錄
.##│ │ ├─view 檢視目錄
│ │ ├─config 設定目錄(優先)
│ │ └─ ... ├─public WEB目錄(外部存取目錄)
│ ├─admin.php 後台入口檔案
│ ├─index.php
##⠔⠔# 快速測驗 └─ .htaccess 用於apache的重寫
│ ├─config 應用程式設定目錄
│ ├─index
##│ ├─view 視圖目錄 │ ├─index │ ├─route 路由定義目錄 │ ├─index index應用程式定義目錄路由定義目錄 │ ├─runtime 運轉時目錄 │ ├─index index 從目錄結構可以看出來,每個應用相對保持獨立,並且可以支援多個入口文件,應用下面還可以透過多層控制器來維護控制器分組。自動多重應用部署
支援在同一個入口檔案中存取多個應用,並且支援應用程式的對應關係以及自訂。如果你透過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應用程式。
自動多應用模式下,路由是每個應用獨立的,所以你沒辦法省略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->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']