1. 程式人生 > >推薦快速上手的ThinkPHP + 使用一週體驗

推薦快速上手的ThinkPHP + 使用一週體驗

Cover

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。