前言
Laravel 10 於 2023 年 2 月 14 日發佈。本指南說明從 Laravel 9.x 升級到 10.x 的步驟。升級預估所需時間約為 10 分鐘。不過破壞性變更對應用程式的影響會因規模與使用的功能而異。
使用 Laravel Shift 自動化升級
也可以使用 Laravel Shift 自動化升級。Shift 會自動更新應用程式的依賴套件與設定檔。依影響程度分類的變更
影響程度:高
- 更新依賴套件
- 更新 minimum-stability
影響程度:中
- 資料庫運算式的變更
- 移除 model 的
$dates屬性 - Monolog 3
- Redis 快取 tag
- Service Mocking 的變更
- 語言目錄
影響程度:低
- Closure validation rule 的訊息
- Form Request 的
after方法 - Public path binding
QueryExceptionconstructor- Rate limiter 的回傳值
- 移除
Redirect::home方法 - 移除
Bus::dispatchNow方法 registerPolicies方法- ULID 欄位
升級步驟
更新依賴套件
影響程度:高 請更新composer.json 中以下依賴。
更新 minimum-stability
影響程度:高 請將composer.json 的 minimum-stability 更新為 stable。因為預設值就是 stable,也可以直接移除此設定。
PHP 版本需求
影響程度:高 Laravel 10 需要 PHP 8.1.0 以上與 Composer 2.2.0 以上。破壞性變更 (Breaking Changes)
應用程式
Public path binding
影響程度:低 若你透過將path.public bind 到 container 來自訂 public path,請改為使用 Illuminate\Foundation\Application 的 usePublicPath 方法。
授權
registerPolicies 方法
影響程度:低
AuthServiceProvider 的 registerPolicies 方法現在由框架自動呼叫。可從 boot 方法中移除此方法的呼叫。
快取
Redis 快取 tag
影響程度:中Cache::tags() 現在僅推薦用於使用 Memcached 的應用程式。若使用 Redis 作為快取 driver,請考慮遷移到 Memcached。
資料庫
資料庫運算式的變更
影響程度:中DB::raw 產生的資料庫運算式已被改寫。要取得運算式的原始字串值,必須使用 getValue(Grammar $grammar) 方法。無法再使用 (string) cast。
QueryException constructor
影響程度:非常低
Illuminate\Database\QueryException constructor 的第一個引數新增了字串型 connection name。若有手動 throw 此例外,請修正程式碼。
ULID 欄位
影響程度:低 migration 中不帶引數呼叫ulid 方法時,欄位名稱會是 ulid。之前版本中不帶引數呼叫時,會誤建為名為 uuid 的欄位。
Eloquent
Model 的 $dates 屬性
影響程度:中
Eloquent model 的棄用屬性 $dates 已被移除。請使用 $casts 屬性。
語言化
語言目錄
影響程度:無 不會影響現有應用程式,但新的 Laravel 應用程式 skeleton 預設不再包含lang 目錄。需要時可用 Artisan 指令發佈。
Log
Monolog 3
影響程度:中 Laravel 的 Monolog 依賴已更新至 Monolog 3.x。若在應用中直接使用 Monolog,請確認 Monolog 升級指南。 若使用 BugSnag 或 Rollbar 等第三方 log 服務,可能需要升級到支援 Monolog 3.x 與 Laravel 10.x 的版本。佇列
移除 Bus::dispatchNow 方法
影響程度:低
已棄用的 Bus::dispatchNow 與 dispatch_now 方法已被移除。請使用 Bus::dispatchSync 與 dispatch_sync 方法。
路由
Middleware alias
影響程度:選用 新的 Laravel 應用中,App\Http\Kernel 類別的 $routeMiddleware 屬性已重新命名為 $middlewareAliases。是否套用到既有應用為選用。
Rate limiter 的回傳值
影響程度:低 呼叫RateLimiter::attempt 方法時,你所提供的 closure 回傳值會被原樣回傳。若沒回傳任何值或回傳 null,則會回傳 true。
移除 Redirect::home 方法
影響程度:非常低
已棄用的 Redirect::home 方法已被移除。請改為明確地重新導向到命名路由。
測試
Service Mocking
影響程度:中 已棄用的MocksApplicationServices trait 已從框架中移除。此 trait 提供了 expectsEvents、expectsJobs、expectsNotifications 等測試方法。
若有使用這些方法,請分別遷移到 Event::fake、Bus::fake、Notification::fake。
驗證
Closure validation rule 的訊息
影響程度:非常低 在 closure 型自訂 validation rule 中多次呼叫$fail callback 時,訊息會加到陣列中而不再被覆寫。
另外,$fail callback 現在會回傳物件。若對 validation closure 的回傳值有型別標註,請更新。
Form Request 的 after 方法
影響程度:非常低
Form Request 內的 after 方法已被 Laravel 保留。若在 Form Request 中定義了 after 方法,請重新命名或變更以善用新的「validation 後」功能。