前言
本指南說明如何從 Laravel 10 以前的舊應用程式結構(具備Kernel 類別及多個服務提供者的結構)遷移到 Laravel 11 以後的 Slim Application Skeleton。
需要遷移的情境
於下列情形下可考慮進行遷移:- 為方便新加入的成員對照官方文件,希望將專案結構調整為最新的標準結構
- 希望與 Laravel 11 以後新建立的套件或啟動套件保持整體一致性
- 希望減少源自舊結構的設定檔與類別,使程式碼庫更為單純
前置條件
本指南以下列狀態為前提:- Laravel 版本升級已完成(
laravel/framework ^11.0以後) - 既有測試皆能通過
- 已理解 Laravel 11 以後的應用程式結構(請參考Laravel 11 以後的應用程式結構)
遷移範例
以 Laravel 10 + Breeze(Blade Stack)建立的專案為例,展示保留 Breeze 但僅將應用程式結構遷移至新結構的步驟。1
替換 bootstrap/app.php
舊的 新(Laravel 11 以後):
bootstrap/app.php 是先建立 $app 實例再註冊 Kernel 的形式。將其替換為
Application::configure() 鏈式呼叫。舊(Laravel 10):withMiddleware() 與 withExceptions() 的回呼是用來移植下一步將刪除的 Kernel 檔案中的設定。先保持為空,於後續步驟中再進行加入。2
刪除 HTTP Kernel(app/Http/Kernel.php)
app/Http/Kernel.php 中定義了全域中介層、中介層群組與中介層別名。舊(app/Http/Kernel.php):app/Http/Kernel.php。若有自訂(新增或排除自訂中介層),請先將設定移植到 bootstrap/app.php 的 withMiddleware()
中再刪除。app/Http/Kernel.php。Laravel 11 中,
TrustProxies、EncryptCookies、VerifyCsrfToken 等預設中介層類別也可從
app/Http/Middleware/ 刪除。因已內建於框架端,若不需自訂,檔案本身也不再需要。3
刪除 Console Kernel(app/Console/Kernel.php)
app/Console/Kernel.php 負責排程的定義與指令的自動載入。舊(app/Console/Kernel.php):app/Console/Commands/ 目錄,因此不再需要 $this->load()
的敘述。排程的定義改遷移至 routes/console.php 或 bootstrap/app.php 的 withSchedule()。app/Console/Kernel.php。請勿刪除
app/Console/ 目錄內的自訂 Artisan 指令檔。指令檔應原樣保留,僅刪除 Kernel 類別檔案。4
刪除例外處理器(app/Exceptions/Handler.php)
app/Exceptions/Handler.php 負責例外回報與渲染的設定。舊(app/Exceptions/Handler.php):bootstrap/app.php 的 withExceptions() 再刪除。$dontFlash 中加入自訂項目,也可以同樣的方式移植。app/Exceptions/Handler.php。5
刪除 RouteServiceProvider 並遷移路由註冊
app/Providers/RouteServiceProvider.php 負責路由檔案的載入與速率限制的設定。舊(app/Providers/RouteServiceProvider.php):bootstrap/app.php 的 withRouting()。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 的 新(Laravel 11 以後):trait 所提供的功能替換方式如下。
Controller 基底類別使用了 AuthorizesRequests 與 ValidatesRequests trait。Laravel
11 的新基底類別是不含這些 trait 的簡單抽象類別。舊(Laravel 10):若既有的控制器有使用 trait 的方法,可以選擇修改每個控制器,或將 trait 保留在
Controller
基底類別中。並不需要一次全部變更也能運作。8
刪除不需要的 config 檔案
config/cors.php、config/hashing.php、config/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
運作確認
遷移完成後,依下列順序進行運作確認。若發生問題,請從備份還原已刪除的檔案並確認錯誤訊息。