跳至內容

發行說明

版本控制方案

Laravel 及其其他第一方套件遵循語義化版本控制。主要的框架版本每年發布一次(約在第一季),而次要和修補程式版本可能會每週發布一次。次要版本和修補程式版本絕不應包含重大變更。

當從您的應用程式或套件中引用 Laravel 框架或其組件時,您應始終使用版本限制(例如 ^11.0),因為 Laravel 的主要版本確實包含重大變更。但是,我們致力於確保您始終可以在一天或更短的時間內更新到新的主要版本。

具名引數

具名引數不包含在 Laravel 的向後相容性指南中。我們可能會在必要時選擇重新命名函數引數,以改進 Laravel 程式碼庫。因此,在呼叫 Laravel 方法時使用具名引數時應謹慎,並了解參數名稱未來可能會變更。

支援政策

對於所有 Laravel 版本,錯誤修正會提供 18 個月,而安全性修復則會提供 2 年。對於所有其他程式庫(包括 Lumen),只有最新的主要版本會收到錯誤修正。此外,請查看 Laravel 支援的資料庫版本

版本 PHP (*) 發行版本 錯誤修正至 安全性修正至
9 8.0 - 8.2 2022 年 2 月 8 日 2023 年 8 月 8 日 2024 年 2 月 6 日
10 8.1 - 8.3 2023 年 2 月 14 日 2024 年 8 月 6 日 2025 年 2 月 4 日
11 8.2 - 8.4 2024 年 3 月 12 日 2025 年 9 月 3 日 2026 年 3 月 12 日
12 8.2 - 8.4 2025 年第一季 2026 年第三季 2027 年第一季
生命週期終止
僅限安全性修正

(*) 支援的 PHP 版本

Laravel 11

Laravel 11 透過引入精簡的應用程式結構、每秒速率限制、健康路由、優雅的加密金鑰輪換、佇列測試改進、Resend 郵件傳輸、Prompt 驗證器整合、新的 Artisan 命令等,繼續改進 Laravel 10.x。此外,還引入了 Laravel Reverb,這是一個第一方的可擴展 WebSocket 伺服器,為您的應用程式提供強大的即時功能。

PHP 8.2

Laravel 11.x 需要最低 PHP 版本為 8.2。

精簡的應用程式結構

Laravel 的精簡應用程式結構由 Taylor OtwellNuno Maduro 開發。.

Laravel 11 為新的 Laravel 應用程式引入了精簡的應用程式結構,而無需變更現有的應用程式。新的應用程式結構旨在提供更精簡、更現代的體驗,同時保留 Laravel 開發人員已經熟悉的許多概念。以下我們將討論 Laravel 新應用程式結構的重點。

應用程式啟動檔案

bootstrap/app.php 檔案已重新啟動為程式碼優先的應用程式組態檔案。從這個檔案,您現在可以自訂應用程式的路由、中介層、服務提供者、例外處理等。此檔案統一了先前分散在應用程式檔案結構中的各種高階應用程式行為設定。

return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
//
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();

服務提供者

Laravel 11 不包含五個服務提供者,預設的 Laravel 應用程式結構只包含一個 AppServiceProvider。先前服務提供者的功能已整合到 bootstrap/app.php 中,由框架自動處理,或可以放在應用程式的 AppServiceProvider 中。

例如,事件探索現在預設啟用,大幅減少了手動註冊事件及其監聽器的需求。但是,如果您確實需要手動註冊事件,您可以簡單地在 AppServiceProvider 中執行此操作。同樣地,您先前可能在 AuthServiceProvider 中註冊的路由模型繫結或授權閘道,也可以在 AppServiceProvider 中註冊。

選擇加入 API 和廣播路由

預設情況下不再存在 api.phpchannels.php 路由檔案,因為許多應用程式不需要這些檔案。相反,可以使用簡單的 Artisan 命令建立它們。

php artisan install:api
 
php artisan install:broadcasting

中介層

先前,新的 Laravel 應用程式包含九個中介層。這些中介層執行各種任務,例如驗證請求、修剪輸入字串和驗證 CSRF 權杖。

在 Laravel 11 中,這些中介層已移至框架本身,因此它們不會增加應用程式結構的負擔。已將自訂這些中介層行為的新方法新增至框架,可以從應用程式的 bootstrap/app.php 檔案中叫用。

->withMiddleware(function (Middleware $middleware) {
$middleware->validateCsrfTokens(
except: ['stripe/*']
);
 
$middleware->web(append: [
EnsureUserIsSubscribed::class,
])
})

由於所有中介層都可以透過應用程式的 bootstrap/app.php 輕鬆自訂,因此不再需要單獨的 HTTP「核心」類別。

排程

使用新的 Schedule 外觀,現在可以直接在應用程式的 routes/console.php 檔案中定義排定的任務,而不需要單獨的 console「核心」類別。

use Illuminate\Support\Facades\Schedule;
 
Schedule::command('emails:send')->daily();

例外處理

如同路由和中介層,例外處理現在可以從應用程式的 bootstrap/app.php 檔案中自訂,而不是單獨的例外處理程式類別,從而減少了新的 Laravel 應用程式中包含的檔案總數。

->withExceptions(function (Exceptions $exceptions) {
$exceptions->dontReport(MissedFlightException::class);
 
$exceptions->report(function (InvalidOrderException $e) {
// ...
});
})

基本 Controller 類別

新的 Laravel 應用程式中包含的基本控制器已簡化。它不再延伸 Laravel 的內部 Controller 類別,並且已移除 AuthorizesRequestsValidatesRequests 特徵,因為如果需要,可以將它們包含在應用程式的個別控制器中。

<?php
 
namespace App\Http\Controllers;
 
abstract class Controller
{
//
}

應用程式預設值

預設情況下,新的 Laravel 應用程式使用 SQLite 作為資料庫儲存,以及 Laravel 的 session、快取和佇列的 database 驅動程式。這允許您在建立新的 Laravel 應用程式後立即開始建置應用程式,而無需安裝其他軟體或建立其他資料庫遷移。

此外,隨著時間的推移,這些 Laravel 服務的 database 驅動程式已變得足夠強大,可在許多應用程式環境中用於生產;因此,它們為本地和生產應用程式提供明智的統一選擇。

Laravel Reverb

Laravel Reverb 由 Joe Dixon 開發。.

Laravel Reverb 將極速且可擴展的即時 WebSocket 通訊直接帶入您的 Laravel 應用程式,並提供與 Laravel 現有事件廣播工具(例如 Laravel Echo)的無縫整合。

php artisan reverb:start

此外,Reverb 透過 Redis 的發布/訂閱功能支援水平擴展,讓您可以將 WebSocket 流量分散到多個後端 Reverb 伺服器,這些伺服器都支援單一高需求的應用程式。

有關 Laravel Reverb 的更多資訊,請參閱完整的Reverb 文件

每秒速率限制

每秒速率限制由 Tim MacDonald 貢獻。.

Laravel 現在支援所有速率限制器的「每秒」速率限制,包括 HTTP 請求和佇列任務。先前,Laravel 的速率限制器僅限於「每分鐘」的粒度。

RateLimiter::for('invoices', function (Request $request) {
return Limit::perSecond(1);
});

有關 Laravel 中速率限制的更多資訊,請查閱速率限制文件

健康檢查路由

健康檢查路由由 Taylor Otwell 貢獻。.

新的 Laravel 11 應用程式包含 health 路由指令,該指令指示 Laravel 定義一個簡單的健康檢查端點,可由第三方應用程式健康監控服務或 Kubernetes 等編排系統調用。預設情況下,此路由會在 /up 提供服務。

->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)

當對此路由發出 HTTP 請求時,Laravel 也會觸發一個 DiagnosingHealth 事件,讓您可以執行其他與您的應用程式相關的健康檢查。

優雅的加密金鑰輪換

優雅的加密金鑰輪換由 Taylor Otwell 貢獻。.

由於 Laravel 加密了所有 Cookie,包括應用程式的 Session Cookie,因此基本上對 Laravel 應用程式的每個請求都依賴於加密。然而,正因如此,輪換應用程式的加密金鑰會導致所有使用者登出應用程式。此外,解密先前加密金鑰加密的資料也會變得不可能。

Laravel 11 允許您透過 APP_PREVIOUS_KEYS 環境變數,將應用程式先前的加密金鑰定義為逗號分隔的列表。

當加密數值時,Laravel 將始終使用 APP_KEY 環境變數中的「當前」加密金鑰。當解密數值時,Laravel 將首先嘗試當前金鑰。如果使用當前金鑰解密失敗,Laravel 將嘗試所有先前的金鑰,直到其中一個金鑰能夠解密該數值。

這種優雅解密的方法允許使用者即使在加密金鑰輪換後也能不間斷地繼續使用您的應用程式。

有關 Laravel 中加密的更多資訊,請查閱加密文件

自動密碼重新雜湊

自動密碼重新雜湊由 Stephen Rees-Carter 貢獻。.

Laravel 的預設密碼雜湊演算法是 bcrypt。bcrypt 雜湊的「工作因子」可以透過 config/hashing.php 設定檔或 BCRYPT_ROUNDS 環境變數進行調整。

通常,隨著 CPU/GPU 處理能力的提高,bcrypt 工作因子應該隨著時間的推移而增加。如果您增加了應用程式的 bcrypt 工作因子,Laravel 現在將在使用者使用您的應用程式進行身份驗證時,優雅地自動重新雜湊使用者密碼。

提示驗證

提示驗證器整合由 Andrea Marco Sartori 貢獻。.

Laravel Prompts 是一個 PHP 套件,用於將美觀且使用者友好的表單新增到您的命令列應用程式中,並具有類似瀏覽器的功能,包括佔位符文字和驗證。

Laravel Prompts 透過閉包支援輸入驗證。

$name = text(
label: 'What is your name?',
validate: fn (string $value) => match (true) {
strlen($value) < 3 => 'The name must be at least 3 characters.',
strlen($value) > 255 => 'The name must not exceed 255 characters.',
default => null
}
);

然而,在處理許多輸入或複雜的驗證場景時,這可能會變得繁瑣。因此,在 Laravel 11 中,您可以在驗證提示輸入時使用 Laravel 驗證器的全部功能。

$name = text('What is your name?', validate: [
'name' => 'required|min:3|max:255',
]);

佇列互動測試

佇列互動測試由 Taylor Otwell 貢獻。.

先前,嘗試測試已佇列的任務是否已釋放、刪除或手動失敗很繁瑣,需要定義自訂的佇列虛擬和存根。然而,在 Laravel 11 中,您可以使用 withFakeQueueInteractions 方法輕鬆測試這些佇列互動。

use App\Jobs\ProcessPodcast;
 
$job = (new ProcessPodcast)->withFakeQueueInteractions();
 
$job->handle();
 
$job->assertReleased(delay: 30);

有關測試已佇列任務的更多資訊,請查閱佇列文件

新的 Artisan 命令

類別建立 Artisan 命令由 Taylor Otwell 貢獻。.

新增了新的 Artisan 命令,以允許快速建立類別、枚舉、介面和 Trait。

php artisan make:class
php artisan make:enum
php artisan make:interface
php artisan make:trait

模型 Casts 改進

模型 Casts 改進由 Nuno Maduro 貢獻。.

Laravel 11 支援使用方法而不是屬性來定義模型的 Casts。這允許簡化、流暢的 Cast 定義,尤其是在使用帶有參數的 Cast 時。

/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'options' => AsCollection::using(OptionCollection::class),
// AsEncryptedCollection::using(OptionCollection::class),
// AsEnumArrayObject::using(OptionEnum::class),
// AsEnumCollection::using(OptionEnum::class),
];
}

有關屬性轉換的更多資訊,請查閱Eloquent 文件

once 函式

once 輔助函式由 Taylor OtwellNuno Maduro 貢獻。

once 輔助函式執行給定的回呼,並在請求期間將結果快取在記憶體中。任何後續對具有相同回呼的 once 函式的呼叫都將返回先前快取的結果。

function random(): int
{
return once(function () {
return random_int(1, 1000);
});
}
 
random(); // 123
random(); // 123 (cached result)
random(); // 123 (cached result)

有關 once 輔助函式的更多資訊,請查閱輔助函式文件

使用記憶體資料庫進行測試時效能提升

記憶體資料庫測試效能提升由 Anders Jenbo 貢獻。

Laravel 11 在測試期間使用 :memory: SQLite 資料庫時,提供了顯著的速度提升。為了實現這一點,Laravel 現在維護對 PHP 的 PDO 物件的引用,並在連線之間重複使用它,通常可以將總測試執行時間縮短一半。

改進對 MariaDB 的支援

改進對 MariaDB 的支援由 Jonas StaudenmeirJulius Kiekbusch 貢獻。

Laravel 11 包括改進對 MariaDB 的支援。在先前的 Laravel 版本中,您可以透過 Laravel 的 MySQL 驅動程式使用 MariaDB。然而,Laravel 11 現在包含一個專用的 MariaDB 驅動程式,可為此資料庫系統提供更好的預設值。

有關 Laravel 的資料庫驅動程式的更多資訊,請查閱資料庫文件

檢查資料庫和改進的結構描述操作

改進的結構描述操作和資料庫檢查由 Hafez Divandari 貢獻。

Laravel 11 提供了額外的資料庫結構描述操作和檢查方法,包括原生修改、重新命名和刪除欄位。此外,還提供了用於操作表格、視圖、欄位、索引和外鍵的高級空間類型、非預設結構描述名稱和原生結構描述方法。

use Illuminate\Support\Facades\Schema;
 
$tables = Schema::getTables();
$views = Schema::getViews();
$columns = Schema::getColumns('users');
$indexes = Schema::getIndexes('users');
$foreignKeys = Schema::getForeignKeys('users');