這半個月斷斷續續在學習用PHP的ThinkPHP框架開發後端API。如今總結記錄一下開發一個接口須要作好哪些事,以此提升開發效率,而且也有不錯的擴展性。php
基本是這麼一個流程,略過環境搭建:數據庫
梳理好有哪些接口後,就開始設計數據表:編程
數據表會隨着代碼的編寫作些調整和改變。後端
值得注意的一點,當有兩張表之間的關係是多對多時,記得設計一張中間表存放兩張表各自的id。數組
設計好數據表後,開始編寫一些工具類,有助於提升編寫業務代碼時的效率。app
首先是驗證器(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開發,更加鞏固了我對面向對象編程裏思想的理解和運用。
經過繼承和重寫,能夠把代碼寫得更乾淨簡潔。
類,實例,屬性,方法,怎麼看待他們,而後操做他們,經過此次學習又加深了不少認識。