Skip to main content

前言

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 方法
  • 空間型別的變更
  • Enumerable contract
  • UserProvider contract
  • Authenticatable contract

升級步驟

更新依賴套件

影響程度:高 請更新 composer.json 中以下依賴套件。
若有使用其他套件也一併更新。
更新後執行以下指令安裝依賴。
若有使用 Cashier Stripe、Passport、Sanctum、Spark Stripe、Telescope,需要將 migration 發佈到應用程式中。
若有使用 Laravel installer 也請一併更新。
若原本手動追加 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,請將 migration 壓縮。

浮點數型別變更

影響程度:高 migration 的 doublefloat 欄位型別已在所有資料庫統一。
unsignedDecimalunsignedDoubleunsignedFloat 方法已被移除。若仍要使用 unsigned 屬性請透過 method chain 指定。

Eloquent 模型的 casts 方法

影響程度:低 Eloquent 基底模型類別新增了 casts 方法。若應用程式的 model 中定義了名為 casts 的 relation,因名稱衝突需要變更。

MariaDB 專用 driver

影響程度:非常低 Laravel 11 新增了 MariaDB 專用的資料庫 driver。連線 MariaDB 時可以在設定中使用 mariadb driver。

空間型別的變更

影響程度:低 空間欄位型別已在所有資料庫統一。請改用 geometrygeography,而不是 pointlineStringpolygon 等方法。
若要明確指定型別或空間參考系統,請傳入 subtypesrid

移除 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 支援秒級(而非分級)的速率限制。GlobalLimitLimit 類別的 constructor 開始接收秒為單位的值。
Limit 類別的 decayMinutes 屬性已重新命名為 decaySeconds,並改為秒為單位。 ThrottlesExceptionsThrottlesExceptionsWithRedis 的 constructor 也開始以秒為單位接收。

套件

發佈 Service Provider

影響程度:非常低 Laravel 11 的新建應用程式已不再有 config/app.phpproviders 陣列。若在套件中發佈 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 中移除以避免衝突。

總結

Laravel 11 是包含大規模結構變更的版本,但 Laravel 10 的應用程式結構仍可正常運作,可以逐步遷移。

參考資料

最後修改於 2026年8月2日