文件入口的功能與定義



檔案入口定義

#6.0預設的應用程式入口檔案位於public/index.php,預設內容如下:

// [ 应用入口文件 ]
namespace think;

require __DIR__ . '/../vendor/autoload.php';

// 执行HTTP应用并响应
$http = (new  App())->make('http');
$response = $http->run();
$response->send();
$http->end($response);

如果你沒有特殊的自訂需求,無需對入口檔案做任何的更改。

入口檔案位置的設計是為了讓應用程式部署更安全,請盡量遵循public目錄為唯一的web可存取目錄,其他的檔案都可以放到非WEB存取目錄下方。

控制台入口文件

除了應用入口檔案外,系統還提供了一個控制台入口文件,位於專案根目錄的think(注意該文件沒有任何的後綴)。

該檔案程式碼如下:

#!/usr/bin/env php
<?php
namespace think;

// 加载基础文件
require __DIR__ . '/vendor/autoload.php';

// 应用初始化
(new App())->console->run();

控制台入口檔案用於執行控制台命令,例如:

php think version

系統內建了一些常用的控制台命令,如果您安裝了額外的擴展,也會增加對應的控制台指令,都是透過該入口檔案執行的。

如果app目錄下面直接是controller、model以及view等類別庫目錄,則為單一應用模式(預設模式),如果在app目錄下建立了應用子目錄,則自動變成多應用模式。

單一應用程式和多應用程式的目錄結構差異如下(主要在app目錄)。

單一應用模式

├─app 應用程式目錄

│  ├─controller         控制器目錄

##│  ├─model#   #│  ├─view               檢視目錄

│  └─ ...              # 目錄目錄目錄目錄」 WEB目錄(對外存取目錄)

│  ├─index.php          入口檔案

│  ├─router.php         快速測驗檔案 

├─config                應用程式設定目錄

├─route                #多應用模式

├─app 應用目錄

│  ├─index              主應用

│  │  ├─    模型目錄

│  │  ├─view            檢視目錄

│  │  ├─config        /設定目錄 (優先) 目錄(優先)⠔ ⠔ 更多類別庫目錄

│  ├─admin               後台應用程式

│  │  ├─controller      控制器目錄

│  │  ├─model           模型目錄

#view⠔ 1 #│  │  ├─config          設定目錄(優先)

│  │  └─ ...            更多類別庫目錄

├─public    # │  ├─admin.php          後台入口檔案

│  ├─index.php          入口檔案  htaccess          用於apache的重寫

├─config                應用程式設定目錄

│  ├─index       admin應用配置

├─route                 路由定義目錄

│  ├─index           admin應用路由定義目錄

├─runtime               運轉時目錄

│  ├─index         1 1  admin應用運行時目錄

從目錄結構可以看出來,每個應用相對保持獨立,並且每個應用都有一個對應的入口文件,應用下面還可以透過多層控制器來維護控制器分組。

多重應用程式使用不同的入口的情況下,每個入口檔案的內容都是一樣的,預設入口檔案名稱(不含後綴)就是套用名,如果您的入口檔案名稱和應用程式不一致,例如你的後台admin應用,入口檔案名稱使用了think.php,那麼入口檔案需要改成:

// [ 应用入口文件 ]
namespace think;

require __DIR__ . '/../vendor/autoload.php';

// 执行HTTP应用并响应
$http = (new  App())->make('http');
$response = $http->name('admin')->run();
$response->send();
$http->end($response);

單一應用程式和多應用模式會影響一些系統路徑的值,為了更好的理解本手冊的內容,你可能需要理解下面幾個系統路徑所表示的位置。

##f根目錄專案所在的目錄,預設自動獲取,可以在入口檔案實例化#基礎目錄根目錄下的應用程式目錄目前應用程式所在的目錄,如果是單應用模式則同基礎目錄,如果是多重應用模式,則是配置目錄根目錄下的##執行階段目錄runtimeApp::getRuntimePath()#核心類別庫目錄thinkApp::getThinkPath()#

注意:應用程式支援使用composer套件,這個時候目錄可能是composer套件的類別庫所在目錄。


對於非自動多應用部署的情況,如果要載入composer應用,需要在入口檔案中設定應用程式路徑:

// [ 应用入口文件 ]
namespace think;

require __DIR__ . '/../vendor/autoload.php';

// 执行HTTP应用并响应
$http = (new  App())->make('http');
$response = $http->path('path/to/app')->run();
$response->send();
$http->end($response);

自動多重應用部署

支援在同一個入口檔案中存取多個應用,並且支援應用程式的對應關係以及自訂。

只需要在config/app.php設定檔中設定

// 开启自动多应用模式
'auto_multi_app'    =>    true,

就可以不必為每個應用程式建立入口檔案而是可以透過index.php入口檔案自動存取多個應用,如果採用多入口方式的URL存取是:

// 访问admin应用
http://serverName/admin.php
// 访问shop应用
http://serverName/shop.php

開啟自動多應用模式後,變成

// 访问admin应用
http://serverName/index.php/admin
// 访问shop应用
http://serverName/index.php/shop

也就是說pathinfo位址的第一個參數就表示目前的應用名,後面才是該應用的路由。

如果直接存取

http://serverName/index.php

存取的其實是index應用程式(預設為入口檔案名稱),如果你的預設應用程式不是index,那麼可以透過default_app設定參數指定預設應用。

// 设置默认应用名称
'default_app' => 'home',

接著存取

http://serverName/index.php

其實存取的是home應用程式。

應用程式映射

應用程式映射僅支援自動多應用模式

支援應用程式的別名映射,例如:

'app_map' => [
    'think'  =>  'admin',  // 把admin应用映射为think
],

應用程式映射後,原來的應用程式名稱將無法被訪問,例如上面的admin應用程式不能直接訪問,只能透過think應用程式存取。

如果要使用composer載入應用,需要設定

'app_map'    =>    [
    'think' => function($app) {
        $app->path('path/to/composer/app');
    },
],

網域綁定應用程式

如果你的多應用程式使用多個子網域或獨立域名訪問,你可以在config/app.php設定檔中定義網域名稱和應用程式的綁定。

禁止應用程式訪問

禁止應用程式訪問僅支援自動多應用模式

你如果不希望某個應用程式透過URL訪問,例如,你增加了一個common子目錄用於放置一些公共類別庫,你可以設定

'deny_app_list' =>    ['common']



目錄位置目錄說明取得方法
App類別的時候傳入。 App::getRootPath()
app目錄App::getBasePath()
app/應用程式子目錄#App::getAppPath()
config目錄#App::getConfigPath()
框架執行階段的目錄,單一應用模式就是根目錄的目錄,多重應用模式為runtime/應用程式子目錄
框架核心類別庫的目錄