本篇的建議旨在讓你的ThinkPHP5開發更規範和順利,但僅僅是建議,而不是必須。
關鍵字:
操做方法的參數綁定功能
Request屬性注入
用Request類的getInput方法替代file_get_contents('php://input');
永遠不要在操做方法中(事實上是任何代碼中)使用exit;
使用composer,是趨勢
應用倉庫並不是必須;
把web根目錄指向public目錄而不是根目錄;資源文件不要放到public目錄之外;
TP5完美支持PHP7,TP5正常運行須要PHP5.4+,建議版本爲PHP5.6+;
不要使用普通URL模式訪問;
變量篇
避免直接獲取系統變量,用Request對象的相關方法替代;
無論get仍是post請求,統一用param方法獲取當前請求(任何請求類型)變量;
不要直接操做改變當前請求的系統變量;
使用操做方法的參數綁定功能,而不是本身手動獲取請求參數;
使用依賴注入(TP5的依賴注入很是的簡單);
對於一些請求用到的公共屬性可使用Request屬性注入;
用Request類的getInput方法替代file_get_contents('php://input');
模板中輸出系統變量使用{$Request.param.name}的方式;
多使用Request類的only和except方法獲取多個請求變量;
不要直接操做$_SESSION變量;
任何變量必須事先定義才能操做或者賦值給模板;
路由篇
用動態註冊方法而不是路由配置;
不要在路由配置文件以外定義路由;
用get/post/delete/put等路由註冊方法明確指定請求類型;
保證路由變量和操做方法的參數綁定命名一致(包括可選);
路由地址保持和實際的控制器名和方法名一致(包括大小寫);
爲每一個路由變量明確指定變量規則;
用路由分組簡化路由定義和公共參數;
儘量使用強制路由並配合MISS路由;
優先考慮資源路由尤爲是API開發的時候;
考慮在路由後置行爲中進行統一的權限檢測;
部署後記得執行路由緩存指令;
瞭解下路由的請求緩存對你會有幫助;
控制器篇
建議開啓controller_suffix配置參數,並採用IndexController命名控制器類;
原則上控制器類不須要繼承think\Controller;
給你的控制器類繼承一個公共的基類例如Base便於統一調整;
須要的話在你的基礎控制器類中引入traits\controller\Jump;
API開發儘可能使用資源控制器(命令行php think create:controller 能夠快速生成);
控制器類中避免寫太多的業務邏輯,交由模型類完成;
儘可能避免直接操做數據庫類,而是在模型類中作好封裝;
可能的話儘可能在控制器層完成數據驗證;
不要試圖在初始化方法中調用redirect助手函數,而用$this->redirect方法替代;
始終在控制器方法中return而不是echo以避免影響請求緩存;
用json、view以及redirect助手函數進行響應輸出;
用abort助手函數拋出HTTP異常;
遵循駝峯法命名你的控制器類和文件名;
永遠不要在操做方法中(事實上是任何代碼中)使用exit;
數據庫篇
千萬不要用駝峯法命名數據表和字段;
如非必要避免直接操做Db類;用Db類的name方法而不是table方法;
用視圖查詢view方法替代join方法;
查詢操做盡量的使用field方法,哪怕是field(true);
若是要批量執行SQL語句使用batchQuery方法;
用value方法獲取單個記錄的某個字段值;
用column方法獲多條記錄的某個(或者某些)字段值;
靈活使用cache方法進行查詢緩存處理和刪除(不只是查詢能夠用cache方法);
使用fetchSql方法直接返回sql語句而不實際執行CURD;
部署以後記得執行命令行的php think optimize:schema指令;
strict方法能夠避免多餘的數據字段拋出異常;
關於日期和時間的查詢不妨試試whereTime方法;
數據庫的大多數操做都是自動參數綁定的,通常狀況下無需手動使用bind方法;
insert方法返回的是影響的記錄數而不是主鍵;
使用insertGetId方法插入數據並返回主鍵;
delete(true)能夠無條件的刪除數據;
select和find方法支持閉包,但儘可能不要和鏈式操做混用;
須要查詢大量數據而且分批處理的話使用chunk方法;
對find方法使用主鍵查詢而且cache(true)的話緩存是自動更新的;
模型篇
不要覺得模型性能比Db差,這點差異還不抵不過一條SQL查詢,而帶來的便利是可觀的;
模型的好處千言萬語抵不過兩個字:對象(明白人都會懂);
模型類通常直接繼承think\Model,若有必要也能夠繼承一個公共模型基類;
若是你的模型類沒有任何的數據庫操做的話不須要繼承任何類庫;
模型類不須要使用類後綴Model(對應前面的控制器類後綴);
模型的save方法既能夠新增也能夠更新(並且是自動識別);
模型沒有鏈式操做,全部鏈式操做都是調用的數據庫類Db;
模型支持事件而數據庫類的操做不支持事件;
統一在模型的init方法(靜態方法)中註冊模型事件;
模型沒有數據表前綴的概念只有對應數據表(完整表名)的概念;
每一個模型對應一個數據庫查詢對象Query,彼此獨立;
每一個模型能夠單獨定義本身的數據庫鏈接信息;
模型名不必定就是數據表名,並且能夠單獨定義數據表名稱;
模型查詢的數據返回永遠都是當前模型對象實例(而不是數組,Db類查詢纔是數組);
模型對象能夠直接進行數組操做並不須要使用toArray轉換(包括模板輸出);
模型的查詢操做建議使用get和all方法(靜態方法);
要在模型查詢中使用鏈式查詢能夠定義查詢範圍或者使用閉包;
用save方法新增數據的返回值是影響的記錄數而不是主鍵值,獲取主鍵直接獲取當前模型對象的屬性值便可;
若是僅僅是須要主鍵以外的查詢條件的話,能夠在get或者all方法的第一個參數使用數組;
要模型查詢後的原始數據可使用getData方法;
模型的關聯操做可讓你省去不少的關聯查詢;
鑑於性能考慮,關聯預載入查詢絕對是關聯查詢的首選;
一對一的關聯關係,尤爲是主表和附表的關係考慮使用聚合模型;
軟刪除必須使用模型的delete方法(而不是數據庫類的delete)纔有效;
不要在修改器中修改多個屬性;
修改器是模型纔有的功能,調用數據庫Db類的寫入操做方法是不會觸發的;
不要在同一個模型實例中屢次調用save新增數據,一旦新增數據成功後,再次save就是更新數據了,除非你顯式調用isUpdate(false);
用模型事件取代自動完成;
其它篇
開發過程當中開啓調試模式,部署後記得關閉;
若是不是API開發的話開啓頁面Trace顯示;
不要輕易忽視異常頁面的任何信息,它們不是擺設;
開發中必定要嚴格注意大小寫,這是基本素質;
若是是接口開發嘗試使用 postman 進行調試;
使用命名空間和自動加載,避免直接 require 及 include ;
不建議使用 import 和 vendor 方法;
應用目錄下面的common.php(注意不是command.php)能夠添加應用的函數,而且實時生效;
不要手動下載擴展包放入vendor目錄,不支持composer安裝的擴展類庫直接放入extend;
只要是使用命名空間的第三方類庫,都是能夠直接在TP5下面使用的;
儘量的採用MVVM設計架構來替代MVC架構,充分發揮TP5的API優點;
若是使用模板,避免在模板中使用過多的數據邏輯;
模板繼承和模板佈局是能夠配合使用的;php