關鍵字:
操作方法的參數(shù)綁定功能
Request屬性注入
用Request類的getInput方法替代file_get_contents('php://input');
永遠不要在操作方法中(事實上是任何代碼中)使用exit;
使用composer镀迂,是趨勢
應用倉庫并非必須闹瞧;
把web根目錄指向public目錄而不是根目錄盒让;資源文件不要放到public目錄以外棒呛;
TP5完美支持PHP7维贺,TP5正常運行需要PHP5.4+澈圈,建議版本為PHP5.6+彬檀;
不要使用普通URL模式訪問;
變量篇
避免直接獲取系統(tǒng)變量瞬女,用Request對象的相關方法替代窍帝;
不管get還是post請求,統(tǒng)一用param方法獲取當前請求(任何請求類型)變量诽偷;
不要直接操作改變當前請求的系統(tǒng)變量坤学;
使用操作方法的參數(shù)綁定功能疯坤,而不是自己手動獲取請求參數(shù);
使用依賴注入(TP5的依賴注入非常的簡單)深浮;
對于一些請求用到的公共屬性可以使用Request屬性注入压怠;
用Request類的getInput方法替代file_get_contents('php://input');
模板中輸出系統(tǒng)變量使用{_SESSION變量;
任何變量必須事先定義才能操作或者賦值給模板布卡;
路由篇
用動態(tài)注冊方法而不是路由配置雨让;
不要在路由配置文件之外定義路由;
用get/post/delete/put等路由注冊方法明確指定請求類型忿等;
保證路由變量和操作方法的參數(shù)綁定命名一致(包括可選)栖忠;
路由地址保持和實際的控制器名和方法名一致(包括大小寫);
為每個路由變量明確指定變量規(guī)則贸街;
用路由分組簡化路由定義和公共參數(shù)庵寞;
盡可能使用強制路由并配合MISS路由;
優(yōu)先考慮資源路由尤其是API開發(fā)的時候匾浪;
考慮在路由后置行為中進行統(tǒng)一的權限檢測皇帮;
部署后記得執(zhí)行路由緩存指令卷哩;
了解下路由的請求緩存對你會有幫助蛋辈;
控制器篇
建議開啟controller_suffix配置參數(shù),并采用IndexController命名控制器類将谊;
原則上控制器類不需要繼承think\Controller冷溶;
給你的控制器類繼承一個公共的基類例如Base便于統(tǒng)一調(diào)整;
需要的話在你的基礎控制器類中引入traits\controller\Jump尊浓;
API開發(fā)盡量使用資源控制器(命令行php think create:controller 可以快速生成)逞频;
控制器類中避免寫太多的業(yè)務邏輯,交由模型類完成栋齿;
盡量避免直接操作數(shù)據(jù)庫類苗胀,而是在模型類中做好封裝;
可能的話盡量在控制器層完成數(shù)據(jù)驗證瓦堵;
不要試圖在初始化方法中調(diào)用redirect助手函數(shù)基协,而用$this->redirect方法替代;
始終在控制器方法中return而不是echo以免影響請求緩存菇用;
用json澜驮、view以及redirect助手函數(shù)進行響應輸出;
用abort助手函數(shù)拋出HTTP異常惋鸥;
遵循駝峰法命名你的控制器類和文件名杂穷;
永遠不要在操作方法中(事實上是任何代碼中)使用exit悍缠;
數(shù)據(jù)庫篇
千萬不要用駝峰法命名數(shù)據(jù)表和字段;
如非必要避免直接操作Db類耐量;用Db類的name方法而不是table方法飞蚓;
用視圖查詢view方法替代join方法;
查詢操作盡可能的使用field方法拴鸵,哪怕是field(true)玷坠;
如果要批量執(zhí)行SQL語句使用batchQuery方法;
用value方法獲取單個記錄的某個字段值劲藐;
用column方法獲多條記錄的某個(或者某些)字段值八堡;
靈活使用cache方法進行查詢緩存處理和刪除(不僅是查詢可以用cache方法);
使用fetchSql方法直接返回sql語句而不實際執(zhí)行CURD聘芜;
部署之后記得執(zhí)行命令行的php think optimize:schema指令兄渺;
strict方法可以避免多余的數(shù)據(jù)字段拋出異常;
關于日期和時間的查詢不妨試試whereTime方法汰现;
數(shù)據(jù)庫的大多數(shù)操作都是自動參數(shù)綁定的挂谍,一般情況下無需手動使用bind方法;
insert方法返回的是影響的記錄數(shù)而不是主鍵瞎饲;
使用insertGetId方法插入數(shù)據(jù)并返回主鍵口叙;
delete(true)可以無條件的刪除數(shù)據(jù);
select和find方法支持閉包嗅战,但盡量不要和鏈式操作混用妄田;
需要查詢大量數(shù)據(jù)并且分批處理的話使用chunk方法;
對find方法使用主鍵查詢并且cache(true)的話緩存是自動更新的驮捍;
模型篇
不要以為模型性能比Db差疟呐,這點差別還不抵不過一條SQL查詢,而帶來的便利是可觀的东且;
模型的好處千言萬語抵不過兩個字:對象(明白人都會懂)启具;
模型類一般直接繼承think\Model,如有必要也可以繼承一個公共模型基類珊泳;
如果你的模型類沒有任何的數(shù)據(jù)庫操作的話不需要繼承任何類庫鲁冯;
模型類不需要使用類后綴Model(對應前面的控制器類后綴);
模型的save方法既可以新增也可以更新(而且是自動識別)色查;
模型沒有鏈式操作薯演,所有鏈式操作都是調(diào)用的數(shù)據(jù)庫類Db;
模型支持事件而數(shù)據(jù)庫類的操作不支持事件综慎;
統(tǒng)一在模型的init方法(靜態(tài)方法)中注冊模型事件涣仿;
模型沒有數(shù)據(jù)表前綴的概念只有對應數(shù)據(jù)表(完整表名)的概念;
每個模型對應一個數(shù)據(jù)庫查詢對象Query,彼此獨立好港;
每個模型可以單獨定義自己的數(shù)據(jù)庫連接信息愉镰;
模型名不一定就是數(shù)據(jù)表名,而且可以單獨定義數(shù)據(jù)表名稱钧汹;
模型查詢的數(shù)據(jù)返回永遠都是當前模型對象實例(而不是數(shù)組丈探,Db類查詢才是數(shù)組);
模型對象可以直接進行數(shù)組操作并不需要使用toArray轉(zhuǎn)換(包括模板輸出)拔莱;
模型的查詢操作建議使用get和all方法(靜態(tài)方法)碗降;
要在模型查詢中使用鏈式查詢可以定義查詢范圍或者使用閉包;
用save方法新增數(shù)據(jù)的返回值是影響的記錄數(shù)而不是主鍵值塘秦,獲取主鍵直接獲取當前模型對象的屬性值即可讼渊;
如果僅僅是需要主鍵之外的查詢條件的話,可以在get或者all方法的第一個參數(shù)使用數(shù)組尊剔;
要模型查詢后的原始數(shù)據(jù)可以使用getData方法爪幻;
模型的關聯(lián)操作可以讓你省去很多的關聯(lián)查詢;
鑒于性能考慮须误,關聯(lián)預載入查詢絕對是關聯(lián)查詢的首選挨稿;
一對一的關聯(lián)關系,尤其是主表和附表的關系考慮使用聚合模型京痢;
軟刪除必須使用模型的delete方法(而不是數(shù)據(jù)庫類的delete)才有效奶甘;
不要在修改器中修改多個屬性;
修改器是模型才有的功能祭椰,調(diào)用數(shù)據(jù)庫Db類的寫入操作方法是不會觸發(fā)的臭家;
不要在同一個模型實例中多次調(diào)用save新增數(shù)據(jù),一旦新增數(shù)據(jù)成功后吭产,再次save就是更新數(shù)據(jù)了侣监,除非你顯式調(diào)用isUpdate(false)鸭轮;
用模型事件取代自動完成臣淤;
其它篇
開發(fā)過程中開啟調(diào)試模式,部署后記得關閉窃爷;
如果不是API開發(fā)的話開啟頁面Trace顯示邑蒋;
不要輕易忽視異常頁面的任何信息,它們不是擺設按厘;
開發(fā)中一定要嚴格注意大小寫医吊,這是基本素質(zhì);
如果是接口開發(fā)嘗試使用 postman 進行調(diào)試逮京;
使用命名空間和自動加載卿堂,避免直接 require 及 include ;
不建議使用 import 和 vendor 方法;
應用目錄下面的common.php(注意不是command.php)可以添加應用的函數(shù)草描,并且實時生效览绿;
不要手動下載擴展包放入vendor目錄,不支持composer安裝的擴展類庫直接放入extend穗慕;
只要是使用命名空間的第三方類庫饿敲,都是可以直接在TP5下面使用的;
盡可能的采用MVVM設計架構來替代MVC架構逛绵,充分發(fā)揮TP5的API優(yōu)勢怀各;
如果使用模板,避免在模板中使用過多的數(shù)據(jù)邏輯术浪;
模板繼承和模板布局是可以配合使用的瓢对;