ThinkPHP6架構結構


入口文件(index.php)

使用者請求的PHP文件,負責處理一個請求(注意,不一定是URL請求)的生命週期,入口文件位於public目錄下面,最常見的入口文件就是index.php,6.0支援多重應用入口,你可以為每個應用程式增加入口文件,例如給後台應用程式單獨設定的一個入口文件admin.php 。

如果開啟自動多重應用的話,一般只需要一個入口檔案index.php。

應用程式(application>

支援多重應用,每個應用程式是一個app目錄的子目錄,每個應用程式都有獨立的路由、配置,以及控制器和模型等MVC相關文件,這些應用可以公用框架核心以及擴充。而且可以支援composer應用程式載入。

容器(container)

#ThinkPHP使用(物件)容器統一管理物件實例及依賴注入。
容器類別的工作由think\Container類別完成,但大多數情況下我們都是透過應用類別(think\App類別)或是app助手函數來完成容器操作,容器中所有的物件實例都可以透過容器標識單例調用,你可以給容器中的物件實例綁定一個物件標識,如果沒有綁定則使用類別名稱作為容器標識。

系統服務

系統服務的概念是指在執行框架的某些元件或功能的時候需要依賴的一些基礎服務,服務類別通常可以繼承系統的think\Service類,但不強制。

你可以在系統服務中註冊一個物件到容器,或對某些物件進行相關的依賴注入。由於系統服務的執行優先權問題,可以確保相關元件在執行的時候已經完成相關依賴注入。

路由(route)

路由是用於規劃(一般同時也會進行簡化)請求的存取位址,在存取位址和實際操作方法之間建立一個路由規則=> 路由位址的對應關係。######ThinkPHP並非強制使用路由,如果沒有定義路由,則可以直接使用“控制器/操作」的方式訪問,如果定義了路由,則該路由對應的路由地址就被不能直接訪問了。一旦開啟強制路由參數,則必須為每個請求定義路由(包括首頁)。### ###使用路由有一定的效能損失,但隨之也更安全,因為每個路由都有自己的生效條件,如果不滿足條件的請求是被過濾的。你遠比你在控制器的操作中進行各種判斷要實用的多。######其實路由的作用遠非URL規範這麼簡單,還可以實現驗證、權限、參數綁定及響應設定等功能。######## #控制器(controller)#########每個應用程式下面擁有獨立的類別庫及設定文件,一個應用程式下面有多個控制器負責回應請求,而每個控制器其實就是一個獨立的控制器類別。###

控制器主要負責請求的接收,並呼叫相關的模型處理,並最終透過視圖輸出。嚴格來說,控制器不應該過多的介入業務邏輯處理。

事實上,控制器是可以被跳過的,透過路由我們可以直接把請求調度到某個模型或其他的類別進行處理。

ThinkPHP的控制器類別比較靈活,可以無需繼承任何基礎類別庫。

一個典型的Index控制器類別(單一應用模式)如下:

<?php
namespace app\controller;

class Index 
{
    public function index()
    {
        return 'hello,thinkphp!';
    }
}

一般建議繼承一個基礎的控制器,方便擴充。系統預設提供了一個app\BaseController控制器類別。

操作(action)

一個控制器包含多個操作(方法),操作方法是一個URL存取的最小單元。

下面是一個典型的Index控制器的操作方法定義,包含了兩個操作方法:

<?php
namespace app\controller;

class Index 
{
    public function index()
    {
        return 'index';
    }
    
    public function hello(string $name)
    {
        return 'Hello,'.$name;
    }
}

操作方法可以不使用任何參數,如果定義了一個非可選參數,且不是物件類型,則該參數必須透過使用者請求傳入,如果是URL請求,則通常是透過目前的請求傳入,操作方法的參數支援依賴注入。

模型(model)

模型類別通常完成實際的業務邏輯和資料封裝,並傳回和格式無關的資料。

模型類別不一定要存取資料庫,而且在ThinkPHP的架構設計中,只有進行實際的資料庫查詢操作的時候,才會進行資料庫的連接,是真正的惰性連接。

ThinkPHP的模型層支援多層設計,你可以對模型層進行更細化的設計和分工,例如把模型層分為邏輯層/服務層/事件層等等。

模型類別通常需要繼承think\Model類,一個典型的User模型器類別如下:

<?php
namespace app\model;

use think\Model;

class User extends Model
{
}

視圖(view)

控制器呼叫模型類別後,傳回的資料透過視圖組裝成不同格式的輸出。視圖根據不同的需求,來決定呼叫模板引擎進行內容解析後輸出還是直接輸出。

模板引擎(template)

模板檔案中可以使用一些特殊的模板標籤,這些標籤的解析通常由模板引擎負責實作。

新版不再內建think-template模板引擎,如果需要使用ThinkPHP官方模板引擎,需要單獨安裝think-view模板引擎驅動擴充。

驅動(drive)

系統很多的元件都採用驅動式設計,因此可以更靈活的擴展,驅動類別的位置預設是放入核心類別庫目錄下面,也可以重新定義驅動類別庫的命名空間而改變驅動程式的檔案位置。

6.0版本的驅動程式採用Composer的方式安裝和管理。

中介軟體(middleware)

中間件主要用於攔截或過濾應用的HTTP請求,並進行必要的業務處理。

新版部分核心功能使用中間件處理,你可以靈活關閉。包括Session功能、頁面Trace功能、請求快取和多語言功能。

事件(event)

#

6.0已經使用事件機制取代原來的行為和Hook機制,可以在應用中使用事件機制的特性來擴展功能。

此外資料庫操作和模型操作在完成資料操作的回呼機制,也使用了事件機制。

助手函數(helper)

系統為一些常用的操作提供了助手函數支持,但核心框架本身並不依賴任何助手函數。使用助手函數和效能並無直接影響,只是某些時候無法享受IDE自動提醒的便利,但是否使用助手函數看項目自身規範,在應用的公共函數文件中也可以對系統提供的助手函數進行重寫。




#