系統多應用模式


多重應用程式

預設安裝後使用單一應用模式部署,目錄結構如下:

├─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']