這半個月斷斷續續在學習用PHP的ThinkPHP框架開發後端API。現在總結記錄一下開發一個介面需要做好哪些事,以此提高開發效率,並且也有不錯的擴充套件性。
一、流程概要
基本是這麼一個流程,略過環境搭建:
- 整理清楚有哪些介面
- 設計資料表
- 初步梳理是一對一,一對多,還是多對多
- 編寫驗證器
- 編寫全域性異常類(AOP思想)
- 定義路由路徑
- 建立控制器類
- 建立模型類
- 用ORM,所以建立和資料表對應的模型類
- 控制器呼叫模型,模型呼叫資料庫,完成介面編寫
二、具體說明
梳理好有哪些介面後,就開始設計資料表:
資料表會隨著程式碼的編寫做些調整和改變。
值得注意的一點,當有兩張表之間的關係是多對多時,記得設計一張中間表存放兩張表各自的id。
設計好資料表後,開始編寫一些工具類,有助於提高編寫業務程式碼時的效率。
首先是驗證器(validate)。
TP5框架自帶驗證器類,我們要做的則是繼承這個驗證器類,然後根據具體的介面做擴充套件即可。
建立一個驗證器基類,把通用的方法放在裡面:
goCheck()方法是所有具體驗證器都會呼叫的方法,各個具體驗證器只是會重寫一些驗證規則和驗證返回資訊而已。
在goCheck()方法裡,例項化了Request類。這樣做的目的是獲取API被呼叫時,呼叫方傳遞的引數。獲取到引數後,自然就是對這些引數進行驗證了。check()方法會呼叫各個具體驗證器裡設定的驗證規則函式進行檢測。
然後是全域性異常類(global exception)。
同樣的,TP5框架自帶了一個異常類,我們就建立一個異常基類繼承它。
隨後需要做的則是根據具體的介面重寫HTTP狀態碼,錯誤訊息和錯誤碼即可。
至於錯誤碼的定義,則是自己設計一套規範。
搭建好驗證器和全域性異常類後,我們只需要在每個介面的函式裡面呼叫他們就行了:
好,至此一些基礎的東西就搭建好了,下面開始編寫介面程式碼。
首先定義路由路徑:
在route.php裡,引入Route類,定義路徑即可。路徑裡的變數用:號+變數名錶示,路徑裡的變數由路徑末尾指定的函式接收,這個函式定義在控制器相對應的類裡面。
比如id這個變數:
如上圖,在控制器裡,當拿到呼叫方通過路由路徑傳過來的引數後,我們就呼叫模型,把引數傳過去,模型處理具體的資料庫呼叫。
這裡也是一個需要注意的點,控制器儘量只做連線的事情,不做具體的操作。
然後,在建立了控制器後,順理成章,也需要建立對應的模型。
TP5同樣自帶了Model類,然後我們也定義自己的模型基類,當然也是繼承TP5的模型類:
模型基類自然也是定義較為通用的方法。比如上圖的例子裡,定義了一個返回圖片字首連結的方法,不同的介面但又跟圖片呼叫有關的話,就會用到這個方法來拼接圖片URL。
這裡也有個注意的點。當我們需要建立全域性的變數時,可以在application目錄下建立extra目錄檔案,然後建立setting.php檔案,在裡面返回一個關聯陣列即可:
隨後的呼叫如上圖模型基類裡的prefixImgUrl方法裡展示的一樣,config函式,引數傳入檔名加關聯陣列的key值,這樣就可以獲取到了:
回到模型上來,每個介面會有自己的模型類,這個模型類對應一張資料表,比如:
Banner模型類由於是通過模型基類繼承了TP5的Model類,我們需要做的就是重寫一些屬性,來適應這個具體的介面,比如重寫$hidden屬性,定義這個介面返回的哪些欄位我們是要隱藏的。
然後則是ORM的重點之一,呼叫資料表所對應的模型類。比如items方法裡,通過hasMany()這個方法確定了Banner模型和BannerItem模型的關係。然後在getBannerById()方法裡,呼叫了ORM用來運算元據的方法,這是對原生運算元據庫語句的封裝,然後ORM會返回模型物件,這個物件除了帶有資料庫資料外,還會帶有一些屬性和方法,用來運算元據。這是ORM對比原生SQL語句的一個優勢。
最後,控制器呼叫模型的getBannerById()方法,獲取到了資料,再作為介面的返回值傳遞給介面呼叫者。這樣就完成了一次介面的編寫。
三、總結
至此做了一個簡要的後端API開發流程記錄。其中還有很多細節沒有提到,只是簡略的描述了一個過程,不過這也不是這次記錄的主要目的。這次的目的還是對這一週多學習的一個記錄。
通過這次學習後端API開發,更加鞏固了我對物件導向程式設計裡思想的理解和運用。
通過繼承和重寫,可以把程式碼寫得更乾淨簡潔。
類,例項,屬性,方法,怎麼看待他們,然後操作他們,通過這次學習又加深了很多認識。