THhinkPHP5.0是基於MVC(模型-視圖-控制器)方式來組織的,MVC的全稱是Model View Controller,是模型-視圖-控制器的縮寫,是一種軟體設計典範,用一種業務邏輯,數據,界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件裏,在改進和個性化定製界面以及用戶交互的同時,不需要重新編寫業務邏輯。MVC被獨特地發展起來用於映射傳統的輸入,處理和輸出功能在一個邏輯的圖形化用戶界面的結構中。而MVC開發模式是一種使用MVC設計創建Web應用程序的模式。

傳統的Web開發中,我們將數據的處理和數據顯示寫在一起,模型和視圖是直接關聯的,視圖直接從模型獲取數據並顯示,代碼複雜,維護困難,不利於團隊分工,開發效率低

傳統開發模式類似如下代碼:

而使用MVC開發時,情況則發生了變化,模型和視圖依舊負責數據處理和數據顯示,但它們之間並不直接進行數據交換,而是藉助控制器完成,控制器首先從模型中獲取數據,然後根據數據的類型或者格式等選擇合適的視圖進行顯示,從而達到模型與視圖的完全分離,而是由控制器完成數據獲取與展示

Model是應用程序中用以處理應用程序數據邏輯的部分,通常模型對象負責在資料庫中存取數據,View是應用程序中處理數據顯示的部分,通常視圖是一句模型數據創建的。Controller是應用程序中處理用戶交互的部分。通常控制器負責從視圖中讀取數據控制用戶輸入並向模型發送數據。

ThinkPHP的應用目錄:

我們可以注意到在public目錄下有一個index.php,該文件是應用的入口文件,幾乎所有的PHP MVC框架都會採用單一入口(網站的所有訪問都會經過該文件)進行項目訪問,ThinkPHP也不例外。入口文件主要完成以下事情:

1. 定義框架路徑,項目路徑

2. 定義調試模式和應用模式(可選)

3. 定義全局常量(可選)

4. 載入框架入口文件

Index.php代碼如下:

當我們載入一個初始的thinkphp5框架時,顯示出的是一個「歡迎使用ThinkPHP!」

大致的載入流程如下:

1. Web伺服器載入默認首頁

2. Index.php載入ThinkPHP.php,框架開始運行

3. 當未指定模塊,控制器和動作時,框架採用默認配置:Home模塊,Index控制器,index動作

4. 根據APP_PATH找到Application目錄,再根據模塊名,控制器名和動作名找到Home目錄下的IndexController.class.php,並執行其中的index方法。

ThinkPHP中的控制器:

作為MVC模式中最核心的控制器,起著溝通視圖和模型的作用一個好的MVC架構中,View永遠不應該直接操作Model,而應該通過View->Controller->Model的方式進行操作。一方面減少了耦合程度,另一方面之後對View進行重構時不會影響到Model。

一般來說ThinkPHP的控制器就是一個類,該類位於模塊/Controller文件夾下,而操作指的是控制器的一個public方法,以下截圖是最近筆者在做的一個項目的實例:(v1是版本號便於版本控制)

由上圖我們可以發現控制器的定義非常簡單,只需滿足兩個條件:(1)文件是一個php類並存放在模塊/Controller文件夾下(2)繼承ThinkPHP的Controller及其子類。

ThinkPHP中的視圖:

視圖功能由 hinkView類配合視圖驅動(模板引擎)類一起完成,目前的內置模板引擎包括PHP原生模板和Think模板引擎

因為新版的控制器可以無需繼承任何的基礎類,因此在控制器中如何使用視圖取決於你怎麼定義控制器。

1. 繼承 hinkcontroller類

如果你的控制器繼承了 hinkController類的話,則無需自己實例化圖類,可以直接調用控制器基礎類封裝的相關視圖類的方法。如:

fetch渲染模板輸出

display渲染內容輸出

assign模板變數賦值

engine初始化模板引擎

2. 助手函數:

如果只是需要渲染模板輸出可以使用系統提供的助手函數view

return view(hello,[name=>thinkphp])

助手函數調用格式:

view([模板文件][,模板變數(數組)][,模板替換(數組)])

ThinkPHP中的模型:

模型類:ThinkModel配合資料庫中間層ThinkDb實現了完整的ORM功能,包括CURD和ActiveRecord實現。

基礎模型類Model的設計非常靈活,無需進行任何模型定義,就可以進行相關數據表的ORM和CURD操作,只需要在封裝單獨的業務邏輯的時候,模型類才必須是被定義的。

新版採用了PHP的Trait特性實現了模型的動態組裝,可以更加靈活的實現模型的擴展

當我們需要使用模型時,首先我們需要在database.php配置文件中進行相關的設置:

而模型的定義方面,如果我們僅僅需要實現對數據表的CURD操作的話,實際上根本不需要定義模型類,直接實例化基礎模型類即可。 只有當你需要額外定義模型的屬性或者方法邏輯的時候,才需要額外定義模型類。模型類一般位於模塊的 model 目錄下面,類名通常與數據表的名相同

例如:

當我們需要使用模型時,我們需要在對應的控制器中引入該模型類,使用相關的查詢語句,核心ThinkModel除了基本的CURD和AR查詢之外, 還提供了一些統計函數、getField方法,及動態查詢方法,使用如下:

$User = D(User);

$User->count();

$User->getField(name);

$User->getByName(thinkphp);

$User->getFieldByName(thinkphp,name);


推薦閱讀:
查看原文 >>
相關文章