推薦快速上手的ThinkPHP + 使用一週體驗
Cover
前言
這幾天接了幾個外包的活,為了快速開發,也順便了解一下ThinkPHP (以下簡稱TP),我大都選擇了使用TP作為開發框架。使用幾天之後,我便不想再使用VUE + iView + PhalAPI 的架構模式了。
只能說在快速開發這個方面,ThinkPHP絕對是最好之一。
所以我來寫這篇文章,介紹這幾天我在使用過程中的體驗,以及我推薦它的理由。
由於我使用TP時間也只有一週,所以沒辦法面面俱到分析優缺點,有些方面可能有錯誤,還望指出。
ThinkPHP
TP作為一個MVC框架,對於基本的MVC模式實現之外,還提供了資料庫模型關聯,驗證器等常用類,使用起來都十分方便,在我這幾天的開發體驗中,我主要體驗到以下優點:
1. 模組機制
2. 引數繫結
3. 強大的ORM
4. 模版語法
5. 驗證器
6. Cookie
7. 開發者友好
模組機制
TP提供了多模組機制,我可以在專案中獨立建立多個模組,其預設會有一個Index模組和Common模組。
Index模組就是一般要開發的前臺,如果我還要做一個後臺,前後臺的模型都是相同的,那麼我會建立一個Admin模組,在其中開發後臺,並在Common模組中寫通用模型方法。在Index與Admin中共同呼叫Common的方法。這樣的結構也很清晰,並且每一個模組都是一個獨立的MVC架構。而如果沒有模組機制,全專案依賴於一個MVC結構,那麼在這種情景中C與V將會十分臃腫。
而設計原則就有:如果有分類,那麼就必須分類。
TP的模組機制提供了一個專案中建立多個MVC的方式,是架構設計方面的一個很好的優點。
引數繫結
這其實是一個小優點,但是對於開發者來說,卻是一個使用十分頻繁的場景。無論是介面API還是表單處理,這都是一個很棒的用法。
在我之前使用的專為API設計的框架PhalAPI中,訪問類的方法要帶的引數需要宣告一個getRules
方法來告訴這個類,訪問什麼方法繫結什麼引數,雖然其提供了很多引數的屬性繫結,但是我還是喜歡TP這種方法的引數定義就是介面API的引數定義這個設定。
所以說在TP中,你可以定義一個方法getNameById
,像下面那樣:
Class User extends Controller {
...
public function getNameById ($id = 0) {
if ($id == 0) {
//沒有傳引數
return $this -> error();
}
return [
'id' => $id,
'name' => 'iimT'
];
}
...
然後在瀏覽器中訪問http://localhost/Index/User/getNameById?id=2
,就會收到返回值:
{
id: 2,
name: 'iimT'
}
在請求中帶的引數,被繫結在方法的引數中,這才符合人的第一直覺嘛。
強大的ORM
TP提供了很強大的ORM(基於PDO),除了最常用的Mysql之外,它還支援很多型別的資料庫,下面是我在TP3.2版本找到的圖,TP5沒有找到類似的圖:
我使用的是Mysql,所以不需要有過多配置,只需要開啟PDO,填好配置檔案的資料庫訪問資訊就好了。
TP的Model類已經封裝好了一系列常用的資料庫操作,CURD都按照不同的使用場景被封裝的很完善。如果你的資料庫中有一張User
的表,要實現getById
只需要這樣:
/* model/User.php */
use Think\Model;
Class User extends Model {
}
/* controller/User.php */
use Think\Controller;
use App\Model\User;
Class User extends Model {
public function getById ($id) {
$model = new User();
return $model -> get($id);
}
}
建立一個名叫User的Model然後在Controller中便可以直接使用。如果有較複雜的資料操作,便寫在Model檔案中。
除了方便的CURD,TP還提供了關聯查詢等高階操作,相比於其他框架這種操作就需要寫原聲Sql命令來執行了。在我這幾天的使用中,TP的關聯查詢對我的效率提升絕對是利器。
模版語法
TP將原生在HTMl中巢狀<? ... >
標籤的方法替換成了自己的模版標籤,使用{}代替php標籤,並封裝了if-else、for、foreach等常用的渲染操作。其中{volist}當居模版使用頻率之首,每次在寫volist的時候,總有一種在寫Vue的v-for的感覺,舒服極了。
驗證器
TP提供了一個驗證資料的類,用來對於不同的模型進行資料校驗,在處理表單提交中尤為方便。而在之前,我們可能會使用多個if-else語句判斷傳入資料是否符合要求,比如使用者註冊場景,我們經常要做:
1. 使用者名稱校驗,無中文,長度限制,數字英文
2. 使用者郵箱合法驗證
3. 使用者手機號合法驗證
4. 使用者密碼長度限制,數字英文
這些事,之前的方案可能是if-else + RegEXP,但是對TP來說,則是小菜一碟,只需定義一個驗證器:
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'name' => 'require|max:25',
'email' => 'require|email',
'pass' => 'require|max:18|min:8',
];
}
然後呼叫驗證器類的check()
方法就可以完成對資料模型的驗證。
Cookie
TP提供了對Cookie操作的封裝,提供了Cookie類。但是我並沒有使用這個類,而是使用它提供的助手函式cookie()
。這個助手函式就像jQuery一樣簡單:
1. 增:cookie("iimt", "Tmii")
就可以設定一個key為iimt值為Tmii的cookie。
2. 改:同上,再次設計就會被更改。
3. 查:cookie('iimt')
即可獲取key為iimt的cookie值。
4. 刪:cookie('iimt', null)
即可刪除key為iimt的cookie。
開發者友好
我室友說第一次進入TP官網以為是盜版,沒想到這真是官網。當然官網是有該吐槽的一面,但是TP對於開發者真是再友好不過了。
文件齊全
TP的文件寫的很全,不管是哪一個版本,都有好幾個文件可以看,收費的寫的更細緻一點,但是免費版完全開發手冊完全夠用了。
社群活躍
無論是在百度,還是TP論壇,還是github,總有很多人活躍著。有問題百度可以很快找到答案,並且由於開發者眾多,基本你遇到的問題都能找到答案。如果找不到答案,社群發帖也會有很多人解答。而在github上,有無數TP做的專案,有成熟專案,也有上手模版。
Layui
這個前端元件庫,現在基本是與TP綁在一起了,據我這幾天的瞭解,至少一半的TP專案使用了Layui。而Layui也是一個十分優秀的前端元件庫,對於使用webpack這麼長時間的我來說,使用它沒有絲毫不順手。而我也將其當作TP生態的一部分作為推薦TP的開發者友好理由了。
總結
說了這麼多,無非是推薦這個PHP的優秀MVC框架。
可以說在這幾天上手中,我沒有任何不適,完全被其圈粉。
如果你也有個新的idea想要實現的話,不妨也試試ThinkPHP。