ThinkPHP5開發的正確姿式——PHP最佳實踐的參考規範

安裝篇

  1. 使用composer,既然是趨勢就早日擁抱,能寫PHP的這點工具用不來講不過去(另外官方的全部擴展都會以composer方式提供);
  2. 若是隻須要核心單獨安裝核心框架就好了,應用倉庫並不是必須;
  3. 若是你安裝的是dev-master,composer更新的也是開發版,若是安裝的是正式版那麼更新的也是最新的正式版(就和Chrome的開發版和正式版同樣);
  4. 把web根目錄指向public目錄而不是根目錄;
  5. 資源文件不要放到public目錄之外;
  6. TP5完美支持PHP7,不要覺得基於PHP7寫的框架纔會支持PHP7;
  7. 若是你的環境是PHP7,你的應用中徹底可使用PHP7的特性;
  8. 不要使用普通URL模式訪問;
  9. TP5正常運行須要PHP5.4+,建議版本爲PHP5.6+;

變量篇

  1. 避免直接獲取系統變量,用Request對象的相關方法替代;
  2. 不要管get仍是post請求,統一用param方法獲取當前請求(任何請求類型)變量;
  3. 不要直接操做改變當前請求的系統變量;
  4. 使用操做方法的參數綁定功能,而不是本身手動獲取請求參數;
  5. 使用依賴注入(TP5的依賴注入很是的簡單);
  6. 對於一些請求用到的公共屬性可使用Request屬性注入;
  7. 用Request類的getInput方法替代file_get_contents('php://input');
  8. 模板中輸出系統變量使用{$Request.param.name}的方式;
  9. 多使用Request類的only和except方法獲取多個請求變量;
  10. 不要直接操做$_SESSION變量;

路由篇

  1. 用動態註冊方法而不是路由配置;
  2. 不要在路由配置文件以外定義路由;
  3. 用get/post/delete/put等路由註冊方法明確指定請求類型;
  4. 保證路由變量和操做方法的參數綁定命名一致(包括可選);
  5. 路由地址保持和實際的控制器名和方法名一致(包括大小寫);
  6. 爲每一個路由變量明確指定變量規則;
  7. 用路由分組簡化路由定義和公共參數;
  8. 儘量使用強制路由並配合MISS路由;
  9. 優先考慮資源路由尤爲是API開發的時候;
  10. 考慮在路由後置行爲中進行統一的權限檢測;
  11. 部署後記得執行路由緩存指令;
  12. 瞭解下路由的請求緩存對你會有幫助;

控制器篇

  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. 遵循駝峯法命名你的控制器類和文件名;
  14. 永遠不要在操做方法中(事實上是任何代碼中)使用exit;

數據庫篇

  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)的話緩存是自動更新的;

模型篇(上)

  1. 不要覺得模型性能比Db差,這點差異還不抵不過一條SQL查詢,而帶來的便利是可觀的;
  2. 模型的好處千言萬語抵不過兩個字:對象(明白人都會懂);
  3. 模型類通常直接繼承think\Model,若有必要也能夠繼承一個公共模型基類;
  4. 若是你的模型類沒有任何的數據庫操做的話不須要繼承任何類庫;
  5. 模型類不須要使用類後綴Model(對應前面的控制器類後綴);
  6. 模型的save方法既能夠新增也能夠更新(並且是自動識別);
  7. 模型沒有鏈式操做,全部鏈式操做都是調用的數據庫類Db;
  8. 模型支持事件而數據庫類的操做不支持事件;
  9. 統一在模型的init方法(靜態方法)中註冊模型事件;
  10. 模型沒有數據表前綴的概念只有對應數據表(完整表名)的概念;
  11. 每一個模型對應一個數據庫查詢對象Query,彼此獨立;
  12. 每一個模型能夠單獨定義本身的數據庫鏈接信息;
  13. 模型名不必定就是數據表名,並且能夠單獨定義數據表名稱;
  14. 模型查詢的數據返回永遠都是當前模型對象實例(而不是數組,Db類查詢纔是數組);
  15. 模型對象能夠直接進行數組操做並不須要使用toArray轉換(包括模板輸出);

模型篇(下)

  1. 模型的查詢操做建議使用get和all方法(靜態方法);
  2. 要在模型查詢中使用鏈式查詢能夠定義查詢範圍或者使用閉包;
  3. 用save方法新增數據的返回值是影響的記錄數而不是主鍵值,獲取主鍵直接獲取當前模型對象的屬性值便可;
  4. 若是僅僅是須要主鍵以外的查詢條件的話,能夠在get或者all方法的第一個參數使用數組; 要模型查詢後的原始數據可使用getData方法;
  5. 模型的關聯操做可讓你省去不少的關聯查詢;
  6. 鑑於性能考慮,關聯預載入查詢絕對是關聯查詢的首選;
  7. 一對一的關聯關係,尤爲是主表和附表的關係考慮使用聚合模型;
  8. 軟刪除必須使用模型的delete方法(而不是數據庫類的delete)纔有效;
  9. 不要在修改器中修改多個屬性;
  10. 修改器是模型纔有的功能,調用數據庫Db類的寫入操做方法是不會觸發的;
  11. 不要在同一個模型實例中屢次調用save新增數據,一旦新增數據成功後,再次save就是更新數據了;

轉載來自《ThinkPHP5快速入門教程》php

相關文章
相關標籤/搜索