前言
Laravel 11 於 2024 年 3 月發佈。本指南說明從 Laravel 10.x 升級到 11.x 的步驟。升級預估所需時間約為 15 分鐘。不過破壞性變更對應用程式的影響會因規模與使用的功能而異。
使用 Laravel Shift 自動化升級
也可以使用 Laravel Shift 自動化升級作業。Shift 會自動更新應用程式的相依套件與設定檔。依影響程度分類的變更
影響程度:高
- 更新依賴套件
- 應用程式結構變更
- 浮點數型別變更
- 變更欄位時屬性的保留
- SQLite 最低版本
- Sanctum 更新
影響程度:中
- Carbon 3
- 密碼再雜湊
- 秒級速率限制
- Spatie Once 套件
影響程度:低
- 移除 Doctrine DBAL
- Eloquent 模型的
casts方法 - 空間型別的變更
EnumerablecontractUserProvidercontractAuthenticatablecontract
升級步驟
更新依賴套件
影響程度:高 請更新composer.json 中以下依賴套件。
doctrine/dbal,現在可以移除。Laravel 11 已經不再依賴此套件。
PHP 版本需求
影響程度:高 Laravel 11 需要 PHP 8.2.0 以上。此外 Laravel 的 HTTP 客戶端需要 curl 7.34.0 以上。應用程式結構變更
影響程度:高 Laravel 11 中預設的應用程式結構被簡化了。Service Provider、middleware、設定檔的數量大幅減少。 不過 不建議 將 Laravel 10 應用程式升級到 Laravel 11 時同時嘗試遷移應用程式結構。Laravel 11 設計為也支援 Laravel 10 的應用程式結構。 主要結構變更點:- 在
bootstrap/app.php直接設定 middleware、例外處理器、路由 - 廢止
app/Http/Kernel.php,整合到bootstrap/app.php - 減少預設的 Service Provider 數量,改由
bootstrap/providers.php管理 - 減少
config/目錄的檔案數量(需要時可用php artisan config:publish公開)
破壞性變更 (Breaking Changes)
認證
密碼再雜湊
影響程度:中 Laravel 11 中,若認證時 hash 演算法的「work factor」有變更,會自動重新雜湊密碼。 若User model 的密碼欄位名稱不是 password,請在 model 的 authPasswordName 屬性中指定。
config/hashing.php 加入以下設定。
UserProvider contract
影響程度:低
Illuminate\Contracts\Auth\UserProvider contract 新增了 rehashPasswordIfRequired 方法。若你有實作此介面的類別,請新增該方法。
Authenticatable contract
影響程度:低
Illuminate\Contracts\Auth\Authenticatable contract 新增了 getAuthPasswordName 方法。若你有實作此介面的類別,請新增該方法。
資料庫
SQLite 最低版本
影響程度:高 若使用 SQLite,需要 SQLite 3.26.0 以上。 另外,Laravel 11 新建專案的預設資料庫 driver 已改為 SQLite。變更欄位時的屬性保留
影響程度:高 變更欄位時,必須明確指定所有想在變更後保留的 modifier。未指定的屬性將被刪除。浮點數型別變更
影響程度:高 migration 的double 與 float 欄位型別已在所有資料庫統一。
unsignedDecimal、unsignedDouble、unsignedFloat 方法已被移除。若仍要使用 unsigned 屬性請透過 method chain 指定。
Eloquent 模型的 casts 方法
影響程度:低
Eloquent 基底模型類別新增了 casts 方法。若應用程式的 model 中定義了名為 casts 的 relation,因名稱衝突需要變更。
MariaDB 專用 driver
影響程度:非常低 Laravel 11 新增了 MariaDB 專用的資料庫 driver。連線 MariaDB 時可以在設定中使用mariadb driver。
空間型別的變更
影響程度:低 空間欄位型別已在所有資料庫統一。請改用geometry 或 geography,而不是 point、lineString、polygon 等方法。
subtype 與 srid。
移除 Doctrine DBAL
影響程度:低 Laravel 已移除對 Doctrine DBAL 的依賴。以下類別與方法已被刪除。Schema\Builder::useNativeSchemaOperationsIfPossible()Connection::getDoctrineConnection()Connection::getDoctrineSchemaManager()Connection::registerDoctrineType()DatabaseManager::registerDoctrineType()Schema\Grammars\ChangeColumn類別Schema\Grammars\RenameColumn類別
Schema::getTables()、Schema::getColumns()、Schema::getIndexes()、Schema::getForeignKeys() 等新的原生方法。
日期
Carbon 3
影響程度:中 Laravel 11 同時支援 Carbon 2 與 Carbon 3。若升級到 Carbon 3,請注意diffIn* 方法會回傳浮點數,並以負值表示時間方向。
速率限制
秒級速率限制
影響程度:中 Laravel 11 支援秒級(而非分級)的速率限制。GlobalLimit、Limit 類別的 constructor 開始接收秒為單位的值。
Limit 類別的 decayMinutes 屬性已重新命名為 decaySeconds,並改為秒為單位。
ThrottlesExceptions 與 ThrottlesExceptionsWithRedis 的 constructor 也開始以秒為單位接收。
套件
發佈 Service Provider
影響程度:非常低 Laravel 11 的新建應用程式已不再有config/app.php 的 providers 陣列。若在套件中發佈 Service Provider,請使用 ServiceProvider::addProviderToBootstrapFile 方法。
Sanctum
Sanctum 更新
影響程度:高 Laravel 11 不支援 Sanctum 3.x。請將composer.json 中的 Sanctum 依賴更新為 ^4.0。
Sanctum 4.0 不再自動載入 migration。請以下列指令發佈。
config/sanctum.php 的 middleware 設定。
Spatie Once 套件
影響程度:中 Laravel 11 現在提供自有的once 函式。若有使用 spatie/once 套件,請從 composer.json 中移除以避免衝突。