# 升級指導
[TOC=2,2]
## 從V5.0.23升級到V5.0.24
支持無縫升級
## 從V5.0.22升級到V5.0.23
支持無縫升級
## 從V5.0.21升級到V5.0.22
支持無縫升級
## 從V5.0.20升級到V5.0.21
支持無縫升級
## 從V5.0.19升級到V5.0.20
支持無縫升級
## 從V5.0.18升級到V5.0.19
支持無縫升級
## 從V5.0.17升級到V5.0.18
由于`5.0.18+`更具嚴謹性,如果數組查詢條件中使用了`exp`查詢,必須做出如下調整:
~~~
// 錯誤
$where['id'] = ['exp', '>score'];
$model->where($where)->find();
// 正確
$where['id'] = ['exp', Db::raw('>score')];
$model->where($where)->find();
// 正確 推薦寫法
$model->whereExp('id', '>score')->find();
~~~
如果需要使用`exp`表達式更新數據,必須使用`Db::raw()`方法或者`exp`方法。下面用法不再支持:
~~~
// 錯誤 不再支持
$data['score'] = ['exp', 'score+1'];
$model->where('id', 1)->update($data);
// 正確
$data['score'] = Db::raw('score+1');
$model->where('id', 1)->update($data);
// 正確 推薦用法
$model->where('id', 1)->exp('score', 'score+1')->update();
~~~
## 從V5.0.16升級到V5.0.17
>[danger] 如果你使用了閉包查詢條件,并且使用了默認的查詢緩存`cache()`或者`cache(true)`,新版本會拋出異常,請使用`cache('key')`替代,避免因為查詢緩存無效而影響業務。
> 如果你在`order`方法中使用了SQL函數,請使用`orderRaw`方法或者`Db::raw()`方法替代。
對于復雜的`field/where/order`字符串參數的,如果發現存在錯誤,盡量使用`fieldRaw/whereRaw/orderRaw`替代(只能傳入字符串參數)。
## 從V5.0.15升級到V5.0.16
### 默認模板渲染規則改進
由于`fetch`方法和`view`函數的默認模板規則調整為操作方法的名稱(不含操作后綴)轉換為小寫+下劃線方式,而不是原來的直接把操作名稱轉小寫。
舉個例子,你的控制器操作方法名如果是`helloWorld`,之前版本使用:
~~~
$this->fetch();
// 或者
view();
~~~
渲染輸出的時候會定位到 `helloworld.html`模板文件,而新版會自動定位到`hello_world.html`模板文件。
> 對于指定模板渲染的`fetch`方法和`view`助手函數不受影響,對于非駝峰操作方法名也沒有影響。
## 從V5.0.14升級到V5.0.15
`V5.0.14`可以無縫升級到`V5.0.15`。
## 從V5.0.13升級到V5.0.14
`V5.0.13`可以無縫升級到`V5.0.14`。
## 從V5.0.12升級到V5.0.13
`V5.0.12`可以無縫升級到`V5.0.13`,如果使用了Redis緩存,需要清空下Redis緩存數據的內容。
## 從V5.0.11升級到V5.0.12
`V5.0.11`可以無縫升級到`V5.0.12`。
## 從V5.0.10升級到V5.0.11
`V5.0.10`可以無縫升級到`V5.0.11`。
>[danger] 升級完成后請務必清空下數據緩存。
## 從V5.0.9升級到V5.0.10
`V5.0.9`可以無縫升級到`V5.0.10`。
## 從V5.0.8升級到V5.0.9
`V5.0.8`可以無縫升級到`V5.0.9`。
## 從V5.0.7升級到V5.0.8
如果自定義了應用的命名空間的話,原來的`app_namespace`配置參數改為`APP_NAMESPACE`常量在入口文件中定義
如果使用了多對多關聯,并且定義了中間表,那么中間表改為去掉前綴后的數據表名。
模型的scope方法之后只能使用數據庫查詢方法而不能使用模型的方法。
## 從V5.0.6升級到V5.0.7
`V5.0.6`可以無縫升級到`V5.0.7`。
## 從V5.0.5升級到V5.0.6
`V5.0.5`可以無縫升級到`V5.0.6`。
由于數據庫緩存策略的改進,之前如果使用了數據緩存,請先清空下數據緩存。
之前因為升級到5.0.5版本后 時間字段使用整型后也會自動格式化輸出的問題,現在可以設置數據庫的配置參數 `datetime_format`值為`false`即可關閉自動轉換。
另外,注意,如果使用了`MongoDb`數據庫擴展的話,請刪除數據庫配置文件中的`query`參數。
## 從V5.0.4升級到V5.0.5
從`V5.0.4`升級到`V5.0.5`需要注意如下事項:
模型的時間日期字段會自動進行格式化輸出,不需要進行額外處理。
原生查詢不再支持返回數據集對象。
`Connection`類的`model`方法已經更改為`getQuery`。
關聯定義方法的`alias`參數已經廢棄。
分頁查詢返回類型變成`think\Paginator`(用法不變)。
數據緩存自動采用子目錄方式避免緩存數據文件過多影響性能。
Session類添加了`secure`和`httponly`參數,并且默認是true,如果不支持請手動關閉。
## 從V5.0.3升級到V5.0.4
從`V5.0.3`升級到`V5.0.4`需要注意如下事項:
模型的關聯定義方法必須采用駝峰法(小寫字母打頭)命名規范,但關聯調用可以支持駝峰和小寫方式。
行為類的方法必須使用駝峰法命名,如果你使用了鉤子位作為行為執行方法入口,請修改為駝峰法,例如 `app_init`鉤子位對應的行為方法名應該是 `appInit`。
如果你使用了Query類的`fetchClass`方法自定義數據集返回對象的話,請改為在模型中設置`resultSetType`屬性,數據庫類不再支持自定義查詢數據集對象(只支持數組和系統的`think\Collection`數據集對象)
## 從V5.0.2升級到V5.0.3
從`V5.0.2`升級到`V5.0.3`需要注意如下事項:
對于join方法和view方法使用子查詢的情況,請盡量使用數組方式:
>[info] ['子查詢'=>'別名']
## 從V5.0.1升級到V5.0.2
從`V5.0.1`升級到`V5.0.2`需要注意如下事項:
下列模型屬性和方法由原來的靜態(static)定義改為動態定義:
* 聚合模型的`relationModel`屬性
* Model類的`useGlobalScope` 屬性
* 軟刪除屬性 `deleteTime`屬性
* 全局查詢范圍方法`base`改為動態方法
原來的`join`方法和`view`方法的第一個參數規范化,支持下面三種用法:
>[info]#### 用法一:[ '帶前綴表名'=>'別名' ]
>#### 用法二:'帶前綴表名 別名'
>#### 用法三:'不帶前綴的表名'
如果有其它用法注意調整,下面的用法不再支持:
>[info] #### '不帶前綴表名 別名'
如果使用了空操作方法,無需給`_empty`方法添加任何參數,當前操作名的獲取直接使用請求對象的`action`函數獲取。
## 從V5.0升級到V5.0.1
從`V5.0`升級到`V5.0.1`需要注意如下事項:
* 擴展配置參數`extra_config_list`廢棄,除了數據庫配置之外的擴展配置放入`application/extra`目錄自動識別加載。
* 模型的`field`屬性無需配置字段類型
* 查詢構建器使用手動參數綁定的時候不要使用`?`號占位綁定,使用命名參數綁定
* 如果使用了`file_get_contents('php://input')`請改為`Request`對象的`getInput()` 方法獲取
* 文件`File`類取消`md5()`和`sha1()`方法,請使用`hash('md5')`和`hash('sha1')`方法替代
## 從V5.0RC4升級到V5.0
可以輕松的從RC4版本升級到正式版,不過請注意如下事項:
* 如果定義了路由映射(靜態路由)的則改為普通路由規則定義
* 定義了路由規則之后,原來的URL地址被禁止訪問,請注意檢查是否還有這種情況
* 如果配置了url_deny_suffix參數,改為路由的deny_ext參數設置
* 模型save方法返回值改為影響的記錄數,并且方法參數中取消了getId參數
* Request對象controller方法返回駝峰控制器名,如果使用該方法渲染模板的話,請使用Loader::parseName(Request::instance()->controller())轉換
* 如果使用了Sqlsrv驅動則,原來自動轉換小寫數據表字段默認不對數據表字段進行小寫轉換,請更改PDO::ATTR_CASE參數
* 如果部署在sae 需要使用sae擴展包
* 如果使用了Sqlsrv/Orace/Firebird驅動,則自行添加原來的驅動文件
* 配置參數讀取的時候取消環境變量判斷,需要讀取環境變量的時候改用Env類
* 環境變量定義文件更改為 .env 由原來的PHP數組改為ini格式定義(支持數組方式)
* 狀態配置和擴展配置的加載順序調整 便于狀態配置文件中可以更改擴展配置的參數
* 取消域名綁定到路由分組功能
* 控制器類的success和error方法url參數支持傳入空字符串,則不做任何處理
>[danger]### 關鍵幾點:
> 默認模板目錄全部是小寫+下滑線規范;
> 控制器類的success、error和redirect方法無需使用return;
> 模型的save方法返回值更改為影響的記錄數,而非主鍵,使用model->id方式獲取主鍵;
> 路由定義后不能再使用原來URL地址訪問;
## 從V3.2版本升級到V5.0
3.2版本無法直接升級到5.0版本,這里只是給出了升級指導思想和為了使用`3.X`版本的開發者更快的熟悉并上手這個全新的版本。同時也強烈建議開發者拋棄之前舊的思維模式,因為`5.0`是一個全新的顛覆重構版本。
### 需要摒棄的3.X舊思想
### URL的變動
首先對3.X的不嚴謹給開發者們帶來的不正確的引導表示歉意,在5.0版本正式廢除類似/id/1方式 可以通過get獲取到id的方法,嚴格來講這樣的url是不屬于$_GET的,現在可以通過param獲取,具體使用可以通過請求部分查詢。
### 模型的變動
新版的模型查詢返回默認對象,系統默認增加了toArray方法,許多開發者在all或select嘗試使用toArray來轉換為數組,在此希望開發者能理解對象的概念,嘗試使用對象進行數據的使用,或者使用db方法進行數據庫的操作,也提醒一下部分濫用toArray的開發者,all或select結果是對象的數組集合,是無法使用toArray進行轉換的。
### 新版變化
### 命名規范
* 目錄和文件名采用‘小寫+下劃線’,并且以小寫字母開頭;
* 類庫、函數文件統一以.php為后綴;
* 類的文件名均以命名空間定義,并且命名空間的路徑和類庫文件所在路徑一致(包括大小寫);
* 類名和類文件名保持一致,并統一采用駝峰法命名(首字母大寫)
### 函數
* 系統已經不依賴任何函數,只是對常用的操作封裝提供了助手函數;
* 單字母函數廢棄,默認系統加載助手函數,具體參考上一個章節‘助手函數’;
### 路由
5.0的URL訪問不再支持普通URL模式,路由也不支持正則路由定義,而是全部改為規則路由配合變量規則(正則定義)的方式,具體這里不再贅述。
### 控制器
控制器的命名空間有所調整,并且可以無需繼承任何的控制器類。
* 應用類庫的命名空間統一為app(可修改)而不是模塊名;
* 控制器的類名默認不帶`Controller`后綴,可以配置開啟`controller_suffix`參數啟用控制器類后綴;
* 控制器操作方法采用`return`方式返回數據,而非直接輸出;
* 廢除原來的操作前后置方法;
### 版本對比
3.2版本控制器寫法
~~~
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller
{
public function hello()
{
echo 'hello,thinkphp!';
}
}
~~~
5.0版本控制器寫法
~~~
namespace app\index\controller;
class Index
{
public function index()
{
return 'hello,thinkphp!';
}
}
~~~
3.2版本控制器命名
~~~
IndexController.class.php
~~~
5.0版本控制器命名
~~~
Index.php
~~~
怎么才能在控制器中正確的輸出模板
5.0在控制器中輸出模板,使用方法如下:
如果你繼承`think\Controller`的話,可以使用:
~~~
return $this->fetch('index/hello');
~~~
如果你的控制器沒有繼承 `think\Controller`的話,使用:
~~~
return view('index/hello');
~~~
### 模型
如果非要對比與舊版本的改進,模型被分為數據庫、模型、驗證器三部分,分別對應M方法、模型、自動驗證,同時均有所加強,下面做簡單介紹。
### 數據庫
5.0的數據庫查詢功能增強,原先需要通過模型才能使用的鏈式查詢可以直接通過Db類調用,原來的M函數調用可以改用db函數,例如:
3.2版本
~~~
M('User')->where(['name'=>'thinkphp'])->find();
~~~
5.0版本
~~~
db('User')->where('name','thinkphp')->find();
~~~
### 模型
新版的模型查詢增加了靜態方法,例如:
~~~
User::get(1);
User::all();
User::where('id','>',10)->find();
~~~
模型部分增強了很多功能,具體請查閱“模型章節”。
### 自動驗證
對比舊的版本,可以理解為之前的自動驗證且不同于之前的驗證;
ThinkPHP5.0驗證使用獨立的`\think\Validate`類或者**驗證器**進行驗證,不僅適用于模型,在控制器也可直接調用,具體使用規則請參考“驗證”章節,這里不再贅述。
### 配置文件
新版對配置很多的配置參數或者配置層次都和之前不同了,建議大家要么看看代碼,要么仔細通讀下官方的開發手冊,不要因為配置的問題浪費自己一整天的時間。
### 異常
5.0對錯誤零容忍,默認情況下會對任何級別的錯誤拋出異常,并且重新設計了異常頁面,展示了詳盡的錯誤信息,便于調試。
### 系統常量的廢棄
5.0版本相對于之前版本對系統變化進行了大量的廢棄,用戶如果有相關需求可以自行定義
下面是廢除常量
~~~
REQUEST_METHOD IS_GET IS_POST IS_PUT IS_DELETE IS_AJAX __EXT__ COMMON_MODULE MODULE_NAME CONTROLLER_NAME ACTION_NAME APP_NAMESPACE APP_DEBUG MODULE_PATH等
~~~
部分常量可以在Request里面進行獲取,具體參考“請求章節”。
> 再次說明本章節僅僅為之前使用3.X版本開發者快速理解5.0所寫,具體5.0的功能還需要開發者通讀手冊。
### 助手函數
`5.0`助手函數和`3.2`版本的單字母函數對比如下:
|`3.2`版本|`5.0`版本|
|---|---|
|C|config|
|E|exception|
|G|debug|
|L|lang|
|T|廢除|
|I|input|
|N|廢除|
|D|model|
|M|db|
|A|controller|
|R|action|
|B|廢除|
|U|url|
|W|widget|
|S|cache|
|F|廢除|
- 序言
- 基礎
- 安裝ThinkPHP
- 開發規范
- 目錄結構
- 架構
- 架構總覽
- 生命周期
- 入口文件
- URL訪問
- 模塊設計
- 命名空間
- 自動加載
- Traits引入
- API友好
- 配置
- 配置目錄
- 配置格式
- 配置加載
- 讀取配置
- 動態配置
- 獨立配置
- 配置作用域
- 環境變量配置
- 路由
- 路由模式
- 路由定義
- 批量注冊
- 變量規則
- 組合變量
- 路由參數
- 路由地址
- 資源路由
- 快捷路由
- 路由別名
- 路由分組
- MISS路由
- 閉包支持
- 路由綁定
- 綁定模型
- 域名路由
- URL生成
- 控制器
- 控制器定義
- 控制器初始化
- 前置操作
- 跳轉和重定向
- 空操作
- 空控制器
- 多級控制器
- 分層控制器
- Rest控制器
- 自動定位控制器
- 資源控制器
- 請求
- 請求信息
- 輸入變量
- 更改變量
- 請求類型
- 請求偽裝
- HTTP頭信息
- 偽靜態
- 方法注入
- 屬性注入
- 參數綁定
- 依賴注入
- 請求緩存
- 數據庫
- 連接數據庫
- 基本使用
- 查詢構造器
- 查詢數據
- 添加數據
- 更新數據
- 刪除數據
- 查詢方法
- 查詢語法
- 鏈式操作
- where
- table
- alias
- field
- order
- limit
- page
- group
- having
- join
- union
- distinct
- lock
- cache
- comment
- fetchSql
- force
- bind
- partition
- strict
- failException
- sequence
- 聚合查詢
- 時間查詢
- 高級查詢
- 視圖查詢
- 子查詢
- 原生查詢
- 查詢事件
- 事務操作
- 監聽SQL
- 存儲過程
- 數據集
- 分布式數據庫
- 模型
- 定義
- 模型初始化
- 新增
- 更新
- 刪除
- 查詢
- 聚合
- 獲取器
- 修改器
- 時間戳
- 只讀字段
- 軟刪除
- 類型轉換
- 數據完成
- 查詢范圍
- 模型分層
- 數組訪問和轉換
- JSON序列化
- 事件
- 關聯
- 一對一關聯
- 一對多關聯
- 遠程一對多
- 多對多關聯
- 多態關聯
- 動態屬性
- 關聯預載入
- 關聯統計
- 聚合模型
- 視圖
- 視圖實例化
- 模板引擎
- 模板賦值
- 模板渲染
- 輸出替換
- 模板
- 模板定位
- 模板標簽
- 變量輸出
- 系統變量
- 請求參數
- 使用函數
- 使用默認值
- 使用運算符
- 三元運算
- 原樣輸出
- 模板注釋
- 模板布局
- 模板繼承
- 包含文件
- 標簽庫
- 內置標簽
- 循環輸出標簽
- 比較標簽
- 條件判斷
- 資源文件加載
- 標簽嵌套
- 原生PHP
- 定義標簽
- 日志
- 介紹
- 日志驅動
- 日志寫入
- 獨立日志
- 日志清空
- 寫入授權
- 錯誤和調試
- 調試模式
- 異常處理
- 拋出異常
- Trace調試
- 變量調試
- 性能調試
- SQL調試
- 遠程調試
- 404頁面
- 驗證
- 驗證器
- 驗證規則
- 錯誤信息
- 驗證場景
- 控制器驗證
- 模型驗證
- 內置規則
- 靜態調用
- 表單令牌
- 安全
- 輸入安全
- 數據庫安全
- 上傳安全
- 其它安全建議
- 雜項
- 緩存
- Session
- Cookie
- 多語言
- 分頁
- 上傳
- 驗證碼
- 圖像處理
- 文件處理
- 單元測試
- 擴展
- 函數
- 類庫
- 行為
- 驅動
- Composer包
- Time
- 數據庫遷移工具
- Workerman
- MongoDb
- SAE
- 標簽擴展
- 命令行
- 自動生成目錄結構
- 創建類庫文件
- 生成類庫映射文件
- 生成路由緩存
- 清除緩存文件
- 生成配置緩存文件
- 生成數據表字段緩存
- 自定義命令行
- 部署
- 虛擬主機環境
- Linux 主機環境
- URL重寫
- 附錄
- 配置參考
- 常量參考
- 助手函數
- 升級指導
- 更新日志