`ThinkPHP`支持傳統的`MVC`(Model-View-Controller)模式以及流行的`MVVM`(Model-View-ViewModel)模式的應用開發,下面的一些概念有必要做下了解,可能在后面的內容中經常會被提及。
## 入口文件
用戶請求的PHP文件,負責處理請求(注意,不一定是HTTP請求)的生命周期,入口文件位于`public`目錄下面,最常見的入口文件就是`index.php`,`6.0`支持多應用多入口,你可以給每個應用增加入口文件,例如給后臺應用單獨設置的一個入口文件`admin.php`。
如果開啟自動多應用的話,一般只需要一個入口文件`index.php`。
## 應用
`6.0`版本提供了對多應用的良好支持,每個應用是一個`app`目錄的子目錄(或者指定的`composer`庫),每個應用具有獨立的路由、配置,以及MVC相關文件,這些應用可以公用框架核心以及擴展。而且可以支持`composer`應用加載。
## 容器
ThinkPHP使用(對象)容器統一管理對象實例及依賴注入。
容器類的工作由`think\Container`類完成,但大多數情況下我們都是通過應用類(`think\App`類)或是`app`助手函數來完成容器操作,容器中所有的對象實例都可以通過容器標識單例調用,你可以給容器中的對象實例綁定一個對象標識,如果沒有綁定則使用類名作為容器標識。
## 系統服務
系統服務的概念是指在執行框架的某些組件或者功能的時候需要依賴的一些基礎服務,服務類通常可以繼承系統的`think\Service`類,但并不強制。
你可以在系統服務中注冊一個對象到容器,或者對某些對象進行相關的依賴注入。由于系統服務的執行優先級問題,可以確保相關組件在執行的時候已經完成相關依賴注入。
## 路由
路由是用于規劃(一般同時也會進行簡化)請求的訪問地址,在訪問地址和實際操作方法之間建立一個路由規則 => 路由地址的映射關系。
ThinkPHP并非強制使用路由,如果沒有定義路由,則可以直接使用“控制器/操作”的方式訪問,如果定義了路由,則該路由對應的路由地址就被不能直接訪問了。一旦開啟強制路由參數,則必須為每個請求定義路由(包括首頁)。
使用路由有一定的性能損失,但隨之也更加安全,因為每個路由都有自己的生效條件,如果不滿足條件的請求是被過濾的。你遠比你在控制器的操作中進行各種判斷要實用的多。
其實路由的作用遠非URL規范這么簡單,還可以實現驗證、權限、參數綁定及響應設置等功能。
## 控制器
每個應用下面擁有獨立的類庫及配置文件,一個應用下面有多個控制器負責響應請求,而每個控制器其實就是一個獨立的控制器類。
控制器主要負責請求的接收,并調用相關的模型處理,并最終通過視圖輸出。嚴格來說,控制器不應該過多的介入業務邏輯處理。
>[danger] 事實上,控制器是可以被跳過的,通過路由我們可以直接把請求調度到某個模型或者其他的類進行處理。
`ThinkPHP`的控制器類比較靈活,可以無需繼承任何基礎類庫。
一個典型的`Index`控制器類(單應用模式)如下:
~~~
<?php
namespace app\controller;
class Index
{
public function index()
{
return 'hello,thinkphp!';
}
}
~~~
> 一般建議繼承一個基礎的控制器,方便擴展。系統默認提供了一個`app\BaseController`控制器類。
## 操作
一個控制器包含多個操作(方法),操作方法是一個URL訪問的最小單元。
下面是一個典型的`Index`控制器的操作方法定義,包含了兩個操作方法:
~~~
<?php
namespace app\controller;
class Index
{
public function index()
{
return 'index';
}
public function hello(string $name)
{
return 'Hello,'.$name;
}
}
~~~
操作方法可以不使用任何參數,如果定義了一個非可選參數,并且不是對象類型,則該參數必須通過用戶請求傳入,如果是URL請求,則通常是通過當前的請求傳入,操作方法的參數支持依賴注入。
## 模型
模型類通常完成實際的業務邏輯和數據封裝,并返回和格式無關的數據。
>[danger] 模型類并不一定要訪問數據庫,而且在ThinkPHP的架構設計中,只有進行實際的數據庫查詢操作的時候,才會進行數據庫的連接,是真正的惰性連接。
ThinkPHP的模型層支持多層設計,你可以對模型層進行更細化的設計和分工,例如把模型層分為邏輯層/服務層/事件層等等。
模型類通常需要繼承`think\Model`類,一個典型的`User`模型器類如下:
~~~
<?php
namespace app\model;
use think\Model;
class User extends Model
{
}
~~~
## 視圖
控制器調用模型類后,返回的數據通過視圖組裝成不同格式的輸出。視圖根據不同的需求,來決定調用模板引擎進行內容解析后輸出還是直接輸出。
視圖通常會有一系列的模板文件對應不同的控制器和操作方法,并且支持動態設置模板目錄。
## 模板引擎
模板文件中可以使用一些特殊的模板標簽,這些標簽的解析通常由模板引擎負責實現。
新版不再內置`think-template`模板引擎,如果需要使用ThinkPHP官方模板引擎,需要單獨安裝`think-view`模板引擎驅動擴展。
## 驅動
系統很多的組件都采用驅動式設計,從而可以更靈活的擴展,驅動類的位置默認是放入核心類庫目錄下面,也可以重新定義驅動類庫的命名空間而改變驅動的文件位置。
>[danger] `6.0`版本的驅動采用`Composer`的方式安裝和管理。
## 中間件
中間件主要用于攔截或過濾應用的`HTTP`請求,并進行必要的業務處理。
>[danger] 新版部分核心功能使用中間件處理,你可以靈活關閉。包括Session功能、請求緩存和多語言功能。
## 事件
`6.0`已經使用事件機制替代原來的行為和Hook機制,可以在應用中使用事件機制的特性來擴展功能。
此外數據庫操作和模型操作在完成數據操作的回調機制,也使用了事件機制。
## 助手函數
系統為一些常用的操作提供了助手函數支持。使用助手函數和性能并無直接影響,只是某些時候無法享受IDE自動提醒的便利,但是否使用助手函數看項目自身規范,在應用的公共函數文件中也可以對系統提供的助手函數進行重寫。
- 序言
- 基礎
- 安裝
- 開發規范
- 目錄結構
- 配置
- 架構
- 請求流程
- 架構總覽
- 入口文件
- 多應用模式
- URL訪問
- 容器和依賴注入
- 服務
- 門面
- 中間件
- 事件
- 路由
- 路由定義
- 變量規則
- 路由地址
- 路由參數
- 路由中間件
- 路由分組
- 資源路由
- 注解路由
- 路由綁定
- 域名路由
- MISS路由
- 跨域請求
- URL生成
- 控制器
- 控制器定義
- 基礎控制器
- 空控制器
- 資源控制器
- 控制器中間件
- 請求
- 請求對象
- 請求信息
- 輸入變量
- 請求類型
- HTTP頭信息
- 偽靜態
- 參數綁定
- 請求緩存
- 響應
- 響應輸出
- 響應參數
- 重定向
- 文件下載
- 數據庫
- 連接數據庫
- 分布式數據庫
- 查詢構造器
- 查詢數據
- 添加數據
- 更新數據
- 刪除數據
- 查詢表達式
- 鏈式操作
- where
- table
- alias
- field
- strict
- limit
- page
- order
- group
- having
- join
- union
- distinct
- lock
- cache
- cacheAlways
- comment
- fetchSql
- force
- partition
- failException
- sequence
- replace
- extra
- duplicate
- procedure
- 聚合查詢
- 分頁查詢
- 時間查詢
- 高級查詢
- 視圖查詢
- JSON字段
- 子查詢
- 原生查詢
- 獲取查詢參數
- 查詢事件
- 獲取器
- 事務操作
- 存儲過程
- 數據集
- 數據庫驅動
- 模型
- 定義
- 模型字段
- 新增
- 更新
- 刪除
- 查詢
- 查詢范圍
- JSON字段
- 獲取器
- 修改器
- 搜索器
- 數據集
- 自動時間戳
- 只讀字段
- 軟刪除
- 類型轉換
- 模型輸出
- 模型事件
- 模型關聯
- 一對一關聯
- 一對多關聯
- 遠程一對多
- 遠程一對一
- 多對多關聯
- 多態關聯
- 關聯預載入
- 關聯統計
- 關聯輸出
- 虛擬模型
- 視圖
- 模板變量
- 視圖過濾
- 模板渲染
- 模板引擎
- 視圖驅動
- 錯誤和日志
- 異常處理
- 日志處理
- 調試
- 調試模式
- Trace調試
- SQL調試
- 變量調試
- 遠程調試
- 驗證
- 驗證器
- 驗證規則
- 錯誤信息
- 驗證場景
- 路由驗證
- 內置規則
- 表單令牌
- 注解驗證
- 雜項
- 緩存
- Session
- Cookie
- 多語言
- 上傳
- 命令行
- 啟動內置服務器
- 查看版本
- 自動生成應用目錄
- 創建類庫文件
- 清除緩存文件
- 生成數據表字段緩存
- 生成路由映射緩存
- 輸出路由定義
- 自定義指令
- Debug輸出級別
- 擴展庫
- 數據庫遷移工具
- Workerman
- think助手工具庫
- 驗證碼
- Swoole
- 附錄
- 助手函數
- 升級指導
- 更新日志