Skip to main content

前言

本指南說明如何從 Laravel 10 以前的舊應用程式結構(具備 Kernel 類別及多個服務提供者的結構)遷移到 Laravel 11 以後的 Slim Application Skeleton。
官方文件並不建議進行此遷移。
  • Laravel 10 的舊結構在 Laravel 11 以後仍可原樣運作。截至包含 Laravel 13 的目前版本,均無終止支援的計畫。
  • 遷移完全屬於自願,並非強制或建議。
  • 若未深入理解舊結構與新結構的差異,強烈建議避免進行遷移。此作業適合對框架內部熟悉的開發者。
  • 遷移前務必備份,並確認所有測試通過。

需要遷移的情境

於下列情形下可考慮進行遷移:
  • 為方便新加入的成員對照官方文件,希望將專案結構調整為最新的標準結構
  • 希望與 Laravel 11 以後新建立的套件或啟動套件保持整體一致性
  • 希望減少源自舊結構的設定檔與類別,使程式碼庫更為單純

前置條件

本指南以下列狀態為前提:
  • Laravel 版本升級已完成laravel/framework ^11.0 以後)
  • 既有測試皆能通過
  • 已理解 Laravel 11 以後的應用程式結構(請參考Laravel 11 以後的應用程式結構

遷移範例

以 Laravel 10 + Breeze(Blade Stack)建立的專案為例,展示保留 Breeze 但僅將應用程式結構遷移至新結構的步驟。
1

替換 bootstrap/app.php

舊的 bootstrap/app.php 是先建立 $app 實例再註冊 Kernel 的形式。將其替換為 Application::configure() 鏈式呼叫。舊(Laravel 10):
新(Laravel 11 以後):
withMiddleware()withExceptions() 的回呼是用來移植下一步將刪除的 Kernel 檔案中的設定。先保持為空,於後續步驟中再進行加入。
2

刪除 HTTP Kernel(app/Http/Kernel.php)

app/Http/Kernel.php 中定義了全域中介層、中介層群組與中介層別名。舊(app/Http/Kernel.php):
Laravel 11 中,上述中介層已作為預設值內建於框架內部。若未進行任何自訂,可直接刪除 app/Http/Kernel.php若有自訂(新增或排除自訂中介層),請先將設定移植到 bootstrap/app.phpwithMiddleware() 中再刪除。
移植完成後,刪除 app/Http/Kernel.php
Laravel 11 中,TrustProxiesEncryptCookiesVerifyCsrfToken 等預設中介層類別也可從 app/Http/Middleware/ 刪除。因已內建於框架端,若不需自訂,檔案本身也不再需要。
3

刪除 Console Kernel(app/Console/Kernel.php)

app/Console/Kernel.php 負責排程的定義與指令的自動載入。舊(app/Console/Kernel.php):
指令的自動載入在 Laravel 11 以後會自動掃描 app/Console/Commands/ 目錄,因此不再需要 $this->load() 的敘述。排程的定義改遷移至 routes/console.phpbootstrap/app.phpwithSchedule()
遷移後刪除 app/Console/Kernel.php
請勿刪除 app/Console/ 目錄內的自訂 Artisan 指令檔。指令檔應原樣保留,僅刪除 Kernel 類別檔案。
4

刪除例外處理器(app/Exceptions/Handler.php)

app/Exceptions/Handler.php 負責例外回報與渲染的設定。舊(app/Exceptions/Handler.php):
若有自訂,請先將其移植到 bootstrap/app.phpwithExceptions() 再刪除。
若曾在 $dontFlash 中加入自訂項目,也可以同樣的方式移植。
移植完成後,刪除 app/Exceptions/Handler.php
5

刪除 RouteServiceProvider 並遷移路由註冊

app/Providers/RouteServiceProvider.php 負責路由檔案的載入與速率限制的設定。舊(app/Providers/RouteServiceProvider.php):
路由檔案的註冊遷移至 bootstrap/app.phpwithRouting()
速率限制遷移至 AppServiceProvider::boot()
若有使用 HOME 常數的地方,可直接替換為 URL 字串,或將常數移到 AppServiceProvider遷移後刪除 app/Providers/RouteServiceProvider.php
6

整理服務提供者

Laravel 10 預設提供 5 個服務提供者。將其統合成 AppServiceProvider.php 單一檔案。要刪除的提供者(先將內容移到 AppServiceProvider 再刪除):遷移舊(app/Providers/AuthServiceProvider.php)內容的範例:
刪除不再需要的提供者檔案後,刪除 config/app.php 中的 providers 陣列。
接著建立 bootstrap/providers.php 以對應新結構。
bootstrap/providers.php 存在,Laravel 會優先讀取此檔案作為提供者清單。
7

更新 Controller 基底類別

Laravel 10 的 Controller 基底類別使用了 AuthorizesRequestsValidatesRequests trait。Laravel 11 的新基底類別是不含這些 trait 的簡單抽象類別。舊(Laravel 10):
新(Laravel 11 以後):
trait 所提供的功能替換方式如下。若既有的控制器有使用 trait 的方法,可以選擇修改每個控制器,或將 trait 保留在 Controller 基底類別中。並不需要一次全部變更也能運作。
若由 Breeze 或 Jetstream 產生的驗證控制器有呼叫 $this->validate()$this->authorize(),變更基底類別前務必先確認運作情況。
8

刪除不需要的 config 檔案

config/cors.phpconfig/hashing.phpconfig/view.php 等未變更為預設的檔案可以刪除。有變更的檔案請保留。
9

更新 public/index.php

因新結構已變更,整份予以覆寫。
10

更新 artisan

artisan 檔案同樣整份覆寫。
11

更新 tests/TestCase.php

CreatesApplication trait 已不再需要,因此進行變更。 tests/CreatesApplication.php 可以直接刪除。
12

更新 .env .env.example phpunit.xml

CACHE_DRIVER 已改為 CACHE_STORE,項目也有所增加,如有必要請進行變更。 由於此區的變更牽涉到 config 檔與正式環境,請謹慎進行。 並不需要勉強跟進。
13

運作確認

遷移完成後,依下列順序進行運作確認。
若發生問題,請從備份還原已刪除的檔案並確認錯誤訊息。

遷移後的檔案結構

遷移後的專案會形成如下的結構(標示出從舊結構的變更點)。

總結

參考連結

最後修改於 2026年8月2日