# ThinkPHP5開發的正確姿勢
> ### 本篇的建議旨在讓你的ThinkPHP5開發更規范和順利,但僅僅是建議,而不是必須。(內容會不斷補充)
## 變量篇
1. 避免直接獲取系統變量,用`Request`對象的相關方法替代;
2. 不用`get`或者`post`方法獲取請求變量,而是用`param`方法替代;
3. 使用操作方法的參數綁定功能,而不是自己手動獲取請求參數;
4. 使用依賴注入和`Request`屬性注入;
5. 用Request類的`getInput`方法替代`file_get_contents('php://input')`;
6. 模板中輸出系統變量使用`{$Request.param.name}`的方式;
7. 多使用Request類的`only`和`except`方法獲取多個請求變量;
## 路由篇
1. 用動態注冊方法而不是路由配置;
2. 不要在路由配置文件之外定義路由;
3. 用`get`/`post`/`delete`/`put`等路由注冊方法明確指定請求類型;
4. 保證路由變量和操作方法的參數綁定命名一致(包括可選);
5. 路由地址保持和實際的控制器名和方法名一致(包括大小寫);
6. 為每個路由變量明確指定變量規則;
7. 用路由分組簡化路由定義和公共參數;
8. 盡可能使用強制路由并配合MISS路由;
9. 優先考慮資源路由尤其是API開發的時候;
10. 考慮在路由后置行為中進行統一的權限檢測;
11. 部署后記得執行路由緩存指令;
## 控制器篇
1. 建議開啟`controller_suffix`配置參數,并采用`IndexController`命名控制器類;
2. 原則上控制器類不需要繼承`think\Controller`;
3. 給你的控制器類繼承一個公共的基類例如`Base`便于統一調整;
4. 需要的話在你的基礎控制器類中引入`traits\controller\Jump`;
5. API開發盡量使用資源控制器(命令行php think create:controller 可以快速生成);
6. 控制器類中避免寫太多的業務邏輯,交由模型類完成;
7. 盡量避免直接操作數據庫類,而是在模型類中做好封裝;
8. 可能的話盡量在控制器層完成數據驗證;
9. 不要試圖在初始化方法中調用`redirect`助手函數,而用`$this->redirect`方法替代;
10. 始終在控制器方法中`return`而不是`echo`以免影響請求緩存;
11. 用`json`、`view`以及`redirect`助手函數進行響應輸出;
12. 用`abort`助手函數拋出HTTP異常;
13. 遵循駝峰法命名你的控制器類和文件名;
## 數據庫篇
1. 千萬不要用駝峰法命名數據表和字段;
2. 如非必要避免直接操作Db類;
3. 用Db類的`name`方法而不是`table`方法;
4. 用視圖查詢`view`方法替代`join`方法;
5. 查詢操作盡可能的使用`field`方法,哪怕是`field(true)`;
6. 如果要批量執行SQL語句使用`batchQuery`方法;
7. 用`value`方法獲取單個記錄的某個字段值;
8. 用`column`方法獲多條記錄的某個(或者某些)字段值;
9. 靈活使用`cache`方法進行查詢緩存處理和刪除(不僅是查詢可以用`cache`方法);
10. 使用`fetchSql`方法直接返回sql語句而不實際執行CURD;
11. 部署之后記得執行命令行的`php think optimize:schema`指令;
12. `strict`方法可以避免多余的數據字段拋出異常;
13. 關于日期和時間的查詢不妨試試`whereTime`方法;
14. 數據庫的大多數操作都是自動參數綁定的,一般情況下無需手動使用`bind`方法;
15. `insert`方法返回的是影響的記錄數而不是主鍵;
16. 使用`insertGetId`方法插入數據并返回主鍵;
17. `delete(true)`可以無條件的刪除數據;
18. `select`和`find`方法支持閉包,但盡量不要和鏈式操作混用;
19. 需要查詢大量數據并且分批處理的話使用`chunk`方法;
20. 對find方法使用主鍵查詢并且cache(true)的話緩存是自動更新的;
## 模型篇
不要以為模型性能比Db差,這點差別還不抵不過一條SQL查詢,而帶來的便利是樂觀的;
模型的好處千言萬語抵不過兩個字:對象(明白人都會懂);
- 脕茫隆壟脨貌脩脭
- 脕茫隆壟脨貌脩脭
- 脪祿隆壟祿霉麓隆
- 脪祿隆壟祿霉麓隆
- 露鎂隆壟URL潞脥脗路脫脡
- 露鎂隆壟URL潞脥脗路脫脡
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脣脛隆壟脢媒戮脻驢芒
- 脣脛隆壟脢媒戮脻驢芒
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脕霉隆壟脛攏脨脥潞脥鹿脴脕陋
- 攏簍1攏漏脛攏脨脥露簍脪氓
- 攏簍2攏漏祿霉麓隆虜脵脳梅
- 攏簍3攏漏露脕脠隆脝梅潞脥脨脼賂脛脝梅
- 攏簍4攏漏脌脿脨脥脳陋祿祿潞脥脳脭露爐脥錨魯脡
- 攏簍5攏漏虜茅脩爐路露脦摟
- 攏簍6攏漏脢盲脠毛潞脥脩茅脰隴
- 攏簍7攏漏鹿脴脕陋
- 攏簍8攏漏脛攏脨脥脢盲魯枚
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 戮脜隆壟API驢陋路壟
- 戮脜隆壟API驢陋路壟
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬露鎂隆壟脭脫脧卯
- Cookie
- Session
- 碌樓脭陋虜芒脢脭
- 脥錄脧帽麓婁脌鉚
- 脦脛錄鎂脡脧麓蘆
- 脩茅脰隴脗毛
- 賂陸脗錄
- A隆壟魯攏錄沒脦脢脤芒錄爐
- B隆壟3.2潞脥5.0脟酶鹵冒
- C隆壟脰煤脢脰潞爐脢媒
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝