V6.0.3版本終於更新發布了,本文總結下該版本的幾個關鍵更新和升級注意事項。
主要更新事件機制不再支援關閉由於事件機制對於擴充套件開發的重要性,如果關閉事件機制會導致開發擴充套件的複雜度加大,考慮到事件機制本身的開銷並不大,所以新版不再支援關閉事件機制,並廢棄了Event類的withEvent方法。
嚴格按照定義順序執行路由的檢測之前路由的檢測機制由於不同的請求型別的路由定義是分組存放的,而且所有的分組路由都是統一放到any請求型別下的,所以會導致在最終執行路由檢測的順序並非嚴格的定義順序,如果你存在同名的路由定義和分組,路由定義會優先檢測而不是按照路由定義的順序進行路由匹配檢測。例如存在下面的路由定義:
之前的版本訪問/api/test/service/my 的話,輸出的是aa而不是my,改進了嚴格按照定義順序執行路由檢測後,輸出的結果就變成my。
此次更新對路由定義的儲存結構做了優化,確保嚴格按照定義順序來依次儲存,從而避免出現因為路由定義和檢測順序不一致的情況而產生的路由混亂。
支援路由到自定義排程類路由支援路由到一個自定義的路由排程類,從而實現更高階的自定義路由解析,此前你可能必須通過路由到閉包的方式實現自定義解析。
// 路由到自定義排程類Route::get('blog/:name',\\app\\route\\BlogDispatch::class);
namespace app\\route;use think\\route\\Dispatch;use think\\route\\Rule;use think\\Request;class BlogDispatch extends Dispatch{ public function exec() { // 自定義路由排程 }}
具體排程類的實現可以參考內建的幾個排程類的實現。
取消除錯模式下預設異常頁面的系統資訊顯示由於開啟除錯模式後,預設的異常頁面中會顯示當前系統的環境變數等系統資訊,有些使用者經常在正式環境中開啟除錯模式,容易導致敏感資訊的洩露而導致安全隱患。最新版本取消了預設異常頁面的系統變數的顯示,如果你在本地除錯的時候需要檢視這些資訊可以自己在頁面Trace資訊裡面除錯輸出。
增加Header方式的多語言自動偵測由於API更多使用header方式而不是GET或者Cookie,新版增加了對header方式自動檢測多語言的支援,並且優先順序依次為GET->header->Cookie。
Facade類的IDE自動提示改進由於之前的版本使用了@mixin註釋完成IDE的自動提示,但由於其它IDE以及phpstorm新版本不支援,所以仍然改成註釋的方式對系統內建Facade進行自動提示。
ORM調整think-orm元件距離上一次框架版本釋出以來已經有幾個小版本更新,最近的調整包括:
改進whereTime查詢對date型別的支援改進多對多關聯改進一對一關聯的屬性綁定當關聯資料不存在的時候的資料格式的一致性修正查詢快取原生查詢不再支援鏈式操作方法升級須知雖然對於上個版本基本無縫升級,但如果你存在不規範的用法,那麼升級過程中很有可能會遇到一些問題,尤其是使用原生查詢的情況下,主要是ORM的一些調整導致。
下面做個注意事項的總結:
connect方法返回型別調整此次think-orm庫更新後,Db類的connect方法返回型別變更為Connection介面而不是原來的Query物件(現在可以更方便的獲取當前的資料庫連線物件),所以你不能直接呼叫Query類的鏈式操作方法,必須首先呼叫table或者name方法指定查詢的資料表。所以下面的不規範用法就會報錯:
Db::field('name')->table('user')->find(1);
規範的用法是
Db::table('user')->field('name')->find(1);
optimize:schema指令改進取消了--db選項,改用--connection選項指定使用的資料庫連線來生成,通過不同的資料庫的連結設定生成欄位快取更加合理。
php think optimize:schema --connection mysql
原來的資料庫欄位快取是用檔案方式存放在runtime/schema目錄下,新版調整後,欄位快取直接納入系統的快取機制,存放目錄則根據你的快取設定不同而有所區別了。
不要在模型中使用原生查詢在模型類中使用原生查詢是不規範的,此次ORM的調整已經禁止在模型中呼叫原生查詢(包括呼叫query和execute方法)。
如果你需要在模型的業務方法中使用原生查詢,必須通過Db類執行。
query查詢不再支援查詢快取下面的用法不再支援:
Db::cache(100)->query('SELECT * FROM think_user where id= 1');
原生查詢指定主庫查詢用法調整cache查詢快取方法並沒有取消,只是不支援在query之前呼叫了
原來的用法
Db::master(true)->query('SELECT * FROM think_user where id= 1');
調整為:
Db::query('SELECT * FROM think_user where id= 1', [], true);
儲存過程procedure方法廢棄master方法並沒有取消,只是不支援在query之前呼叫了
儲存過程方法procedure不再需要,直接使用query或者execute執行儲存過程語句即可。