Laravel 10 的新特性:深入了解最新的更新和功能

已發表: 2023-01-25

在廣受歡迎的 Laravel 框架推出十多年後,您是否想過,“Laravel 還能為 PHP 開發人員提供什麼?”

鑑於它已經為初學者和專業開發人員簡化了 PHP 開發,有些人甚至可能會爭辯說,它已經寵壞了開發人員,讓他們相信 PHP 是目前最簡單的編程語言。

那麼,Laravel 是否還會為 Laravel 開發者帶來更多驚喜呢? 或者它已經用盡了所有可能的方式來支持 PHP 開發人員?

好吧,至少,我們知道 Laravel 10 可以提供很多東西。 這就是我們將在本文中揭示的內容,因為我們將帶您體驗 Laravel 10 的新功能、修復以及新棄用的方法和包。

Laravel 發佈時間表

Laravel 核心團隊過去每年發布兩個主要版本——每六個月發布一個。

然而,當 Laravel 的創建者 Taylor Otwell 宣布現在每年發布一個主要版本時,發布週期發生了變化。 這使核心團隊和社區能夠將更多的時間和精力投入到特定版本的框架中,並在不進行任何重大更改的情況下引入新的強大功能。

隨著 Laravel 9 於 2022 年 2 月 8 日發布,預計發佈時間表如下:

  • Laravel 10 :2023 年 2 月 7 日
  • Laravel 11 :2024 年 2 月 6 日

此外,根據支持政策,所有 Laravel 版本都提供 18 個月的錯誤修復和兩年的安全更新。

以下是預期的錯誤修復和安全更新計劃:

  • Laravel 9 將在 2023 年 8 月 8 日之前繼續獲得錯誤修復,並在 2024 年 2 月 6 日之前繼續獲得安全修復。
  • Laravel 10 將在 2024 年 8 月 6 日之前獲得錯誤修復,並在 2025 年 2 月 4 日之前獲得安全修復。
  • Laravel 11 預計將在 2025 年 8 月 4 日之前獲得錯誤修復,並在 2026 年 2 月 2 日之前獲得安全修復。

你應該升級到 Laravel 10 嗎?

重要的是要記住,我們並不總是需要在新版本發布後立即將應用程序的 Laravel 版本升級到最新版本。

Laravel 是一個開源框架,這意味著每次我們在我們的機器上安裝一個新的 Laravel 實例時,我們都擁有該框架的代碼庫。 這意味著即使我們的應用程序使用的框架版本不再受支持,該應用程序仍然可以運行; 我們只需要自己維護它。

因此,人們普遍建議應用程序穩定性優先於框架升級。

簡而言之,在以下情況下你應該考慮升級到 Laravel 10:

  • 該應用程序在其當前版本中穩定且運行沒有問題。
  • 新版本要么添加您的應用程序需要的功能,要么修復您的應用程序遇到的問題。
  • 在將升級更改推入生產之前,將對應用程序進行良好測試。

Laravel 10 熱更新

Laravel 10 徽標
Laravel 10 徽標的圖像。

如您所知,Laravel 10 尚未發布。 但是,我們將使用有關預期版本的所有最新信息來更新這篇文章。 因此,我們建議將此頁面加入書籤並不時重新訪問它。

Laravel 10 的新特性和更新

毫無疑問,任何新版本最令人興奮的部分是新功能的添加。 因此,事不宜遲,讓我們先看看 Laravel 10 中的新功能和更新。

1. PHP 8.1:Laravel 10 的核心

PHP 8.1 是 Laravel 10 最低要求的 PHP 版本。根據 GitHub 上 Laravel 9 分支和框架的 master 分支的對比,一些 PHP 8.1 的特性,比如readonly properties 和array_is_list ,有望在 Laravel 10 中引入.

2. 支持PHP 8.2

PHP 8.2 於 2022 年 12 月 8 日發布,僅比 Laravel 10 發布日期早兩個月。 然而,這不應該阻止您使用 PHP 8.2 功能,因為無需執行任何額外操作,Laravel 10 將為 PHP 8.2 做好準備。

事實上,包括 Forge、Vapor 和 Envoyer 在內的整個 Laravel 生態系統都支持 PHP 8.2,您甚至可以在 Laravel 9 中使用 PHP 8.2。這有多酷?!

3. Laravel 入門套件升級

一旦發布,Laravel Breeze 和 Jetstream 就可以使用 Laravel 10。 此外,它們也已經升級到 Inertiajs 1,JetStream 還驚喜地提供了完整的暗模式支持。

4. Predis版本升級

Predis 是一個強大的 PHP Redis 客戶端,可以幫助您充分利用緩存來提供出色的用戶體驗。 Laravel 以前支持版本 1 和 2,但是從 Laravel 10 開始,該框架不再支持 Predis 1。

雖然 Laravel 文檔提到 Predis 作為與 Redis 交互的包,但您也可以使用官方的 PHP 擴展。 此擴展提供用於與 Redis 服務器通信的 API。

5. 本地類型聲明

Laravel 曾經在其框架代碼中使用 DocBlocks 來闡明一段代碼的作用以及期望的參數或響應類型。 然而,由於 Laravel 10 中的原生類型聲明,這將會改變。

解釋這種變化的最好方法是用一個簡單的例子。 而不是像這樣的函數:

 /** * Determine whether the user can create models. * * @param \{{ namespacedUserModel }} $user * @return \Illuminate\Auth\Access\Response|bool */ public function create({{ user }} $user) { // }

……它看起來像這樣:

 /** * Determine whether the user can create models. */ public function create({{ user }} $user): bool { // }

此更改純粹是為了開發人員體驗的好處,因為 IDE 將知道預期參數和響應的形狀。 當無法通過 PHP 原生類型實現時,它將提供更好的類型清晰度。 因此,它將幫助代碼編輯器更好地執行自動完成功能。

6. 所有驗證規則默認可調用

如果你要在 Laravel 9 中創建一個可調用的驗證規則,你需要在 artisan 命令後添加--invokable標誌。 這不再是必需的,因為默認情況下所有 Laravel 10 規則都是可調用的。 因此,您可以運行以下命令在 Laravel 10 中創建一個新的可調用規則:

 php artisan make:rule CustomRule

7.原生列修改支持

為了在使用change()修改列時消除對doctrine/dbal包的需求,Laravel 10 中引入了一項新功能。此功能將允許開發人員使用change()方法並修改 MySQL、PostgreSQL 和SQL Server 無需額外的包。 這是一項重大且有風險的重大更改,但我們認為這是值得的,因為它將消除額外軟件包的必要性。

要更好地了解新功能,請參閱以下示例:

 $table->integer('user_balance')->unsigned()->default(0)->comment('balance'); // `user_balance` is an integer, unsigned, defaults to '0', and column comment is 'balance'

現在,我們假設我們有一個user_balance列並且我們想要更改它的類型。 從 Laravel 10 開始,我們可以簡單地這樣做:

 $table->bigInteger('user_balance')->change(); // This will change `user_balance` to bigInteger instead of just integer

上面的代碼將成功更改列的類型,但也會刪除UNSIGNEDDEFAULTCOMMENT屬性。 因此,重要的是要記住在更改列的類型時添加所有屬性:

 $table->bigInteger('user_balance')->unsigned()->default(0)->comment('balance')->change();

如果您有多個數據庫連接並且已經安裝了doctrine/dbal ,建議在App\Providers\AppServiceProviderboot方法中調用Schema::useNativeSchemaOperationsIfPossible()方法,以便能夠使用本機模式操作並使用依賴包之前的原生操作(例如 SQLite,還不支持這個):

 use IlluminateSupportFacadesSchema; class AppServiceProvider extends ServiceProvider { public function boot() { Schema::useNativeSchemaOperationsIfPossible(); } }

8. 列類型原生檢索

Laravel 10 的另一個值得注意的特性是能夠使用Schema::getColumnType方法,而無需依賴doctrine/dbal包。 我們目前使用Schema::getColumnTypedoctrine/dbal來獲取列類型。 doctrine/dbal將每個本機列類型映射到其等價的doctrine/dbal類型,並且它不支持 Laravel 在各種數據庫中使用的許多列類型。

另一方面,在 Laravel 10 中,新的Schema::getColumnType方法將返回實際的列類型,而不是它的doctrine/dbal等價物。 它還使您能夠為新的本機列修改功能編寫集成測試。 您可以使用此功能來獲取指定列的數據類型名稱或整個類型定義:

 Schema::getColumnType('products', 'price'); // decimal

9. 更快的散列算法

xxHash 是一種非常快的哈希算法。 它具有很好的輸出隨機性和分散性,以及減少碰撞的獨特性。 由於 PHP 8.1 提供了對 xxh128 的支持,而 Laravel 10 運行在 PHP 8.1 之上,因此在 Laravel 10 中擁有這樣一個可靠的哈希算法是非常理想的。

值得一提的是,Taylor 在審查此更改時強調,某些第三方軟件包可能依賴於與 SHA-1 哈希格式完全相同的文件名,這是 Laravel 用於哈希的算法。 因此,如果你計劃升級到 Laravel 10,明智的做法是在你的應用程序中使用的任何第三方包中仔細檢查這一點。

10. Eloquent Builder 的 whereExists() 方法支持

當前,使用whereExists()需要使用閉包配置嵌套查詢。 幸運的是,在 Laravel 10 中,現在可以將 Eloquent Builder 作為嵌套查詢包含在內。 它支持使用自定義構建器方法、模型範圍等。

例如,如果我們想使用whereExists() ,我們通常會這樣做:

 Order::whereExists(function ($query) { $query->from('products')->whereColumn('products.order_id', 'orders.id'); });

使用 Laravel 10,我們可以這樣做:

 Order::whereExists( Product::whereColumn('products.order_id', 'orders.id') );

11. 預加載優化

Laravel 10 的一個有趣的新特性是在沒有任何鍵要加載時進行急切加載優化。 此更改與其說是功能,不如說是修復,因為它解決了當前問題,即急切加載關係會導致執行大量不可能的查詢。

當前,當急切加載沒有任何要加載的鍵的關係時,Laravel 仍會執行類似於此查詢的查詢select \* from `table_name` where 0 = 1 。 然而,新的 Laravel 10 更新會首先檢查以驗證是否有可用的密鑰,如果沒有,則提供一個空集合,從而消除了不必要的數據庫查詢的需要。

Laravel 10 中棄用的方法和包

Laravel 10 告別 PHP 8.0

Laravel 框架將在 Laravel 10 中放棄對 PHP 8.0 的支持。因此,如果您打算將應用程序升級到 Laravel 10,則必須先將 PHP 版本更新到 PHP 8.1 或 PHP 8.2。

棄用的方法刪除

我們可以看到 Laravel 核心團隊正在從 Laravel 10 分支中移除 Laravel 9 中棄用的方法。 我們預計團隊將在 Laravel 10 發布後立即更新文檔的升級指南,以包含所有棄用的方法和包。

如果你打算將當前項目遷移到 Laravel 10,任何使用已棄用方法的代碼都應該以新方法重寫以實現相同的結果。

以下是我們在將 Laravel 9 與 master 分支進行比較時發現的所有棄用和刪除的列表:

  • Route::home方法(在 Laravel 9 中已棄用)
  • dispatchNow周圍棄用的函數和方法。 這是為了鼓勵開發人員使用dispatchSync ,這是唯一受支持的立即調度方式。
  • getBaseQuery因為它有一個toBase等價物
  • 不再使用的MaintenanceModeException
  • MocksApplicationServices特性
  • 郵件偽造的Mail::failures方法
  • 棄用的$dates屬性,建議使用$casts代替
  • assertTimesSent()方法
  • 放棄了對Predis 1 和doctrine/dbal 2 的支持
  • 自 Laravel 放棄對版本 2 的支持以來,在doctrine/dbal中所有相關的棄用

如何安裝 Laravel 10

Laravel 10 現已發布,您可以試用並測試其功能。 Laravel 安裝程序中的–dev標誌從laravel/laravel存儲庫安裝 master 分支。 您所要做的就是在終端中運行此命令:

 laravel new example-kinsta-app --dev

或者,如果您更喜歡使用 Composer:

 composer create-project --prefer-dist laravel/laravel example-kinsta-app dev-master

為了更好地理解 Composer 命令,這裡有一個快速解釋:

  • laravel/laravel : Laravel 安裝包
  • example-kinsta-app :新項目的新目錄(可以更改)
  • dev-master :Laravel 的下一個版本(在本例中為 Laravel 10)

安裝 Laravel 10 後,您可以通過導航到新目錄example-kinsta-app並運行 artisan 命令來確認版本:

 $ php artisan --version Laravel Framework 10.x-dev

如何將項目升級到 Laravel 10

你想升級到 Laravel 10 嗎? Laravel 核心團隊努力編寫文檔以提供無縫且直接的升級指南,同時涵蓋所有可能的破壞性更改。 請隨時查看 Laravel 10 升級指南,因為現在可以獲取有關升級過程的一些信息。

一旦 Laravel 10 發布,您還應該關注 Laravel Shift。 它提供了一種簡單且自動化的方法來升級您的 Laravel 版本。

除了 Laravel 文檔和 Laravel Shift,我們在 Kinsta 將發布一個包含真實世界示例的綜合升級指南。 所以,不要忘記將此頁面添加為書籤,並在 Laravel 10 發布後返回。

如何部署 Laravel 10 項目

部署 Laravel 10 與部署 Laravel 9 項目應該沒有太大區別。 這是我們期望的服務器要求可能是:

  • PHP >= 8.1
  • BCMath PHP 擴展
  • Ctype PHP 擴展
  • 捲曲 PHP 擴展
  • DOM PHP 擴展
  • 文件信息 PHP 擴展
  • JSON PHP 擴展
  • Mbstring PHP 擴展
  • OpenSSL PHP 擴展
  • PCRE PHP 擴展
  • PDO PHP 擴展
  • 分詞器 PHP 擴展
  • XML PHP 擴展

您可以在幾分鐘內在 Kinsta 上部署和託管您的 Laravel 10 項目,因為 Laravel 是託管應用程序支持的一長串框架之一。

在 Kinsta 上部署 Laravel 10:分步指南

在 Kinsta 上託管和部署您的應用程序有幾個好處,包括不必為部署配置而煩惱。

Kinsta 提供了一個用戶友好但功能強大的工具,用於部署應用程序、連接到數據庫和監控實時性能。 這個工具被稱為 MyKinsta,在本節中,我們將引導您完成使用它部署 Laravel 10 應用程序的步驟。

1. Laravel 10 應用

Laravel 10 應用主頁
部署在 Kinsta 上的 Laravel 10 應用程序的主頁。

假設你在本地有一個 Laravel 10 應用程序,我們需要確保它有一個可用的 github 存儲庫。 稍後我們將使用此存儲庫來部署應用程序。

您可以在應用程序的根目錄中包含一個.htaccess文件,其中包含以下內容:

 <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.*)$ public/$1 [L] </IfModule>

對於 Laravel,這會將所有請求重定向到 public/index.php。 但是,如果需要,您可以在添加應用程序時(設置流程步驟)或在應用程序的流程頁面上部署後更新此命令。 您可以使用:

  • heroku-php-apache2 /public
  • php artisan serve --host 0.0.0.0 --port 8080

2.登錄MyKinsta

MyKinsta 登錄頁面
MyKinsta 登錄頁面的屏幕截圖。

前往 MyKinsta 登錄頁面並輸入您的電子郵件地址和密碼。 如果您還沒有帳戶,您可以註冊一個新帳戶並在任何定價計劃訂閱的第一個月獲得 20 美元的折扣。

3.在GitHub上授權Kinsta

登錄後,您會注意到儀表板有 3 個選項來創建 WordPress 站點、創建應用程序或創建數據庫。 我們將按下連接 GitHub按鈕以與 GitHub 集成。

MyKinsta 儀表板
MyKinsta 儀表板的屏幕截圖。

接下來,單擊繼續使用 GitHub按鈕。 如果您尚未登錄 GitHub,系統會顯示登錄選項。然後您可以通過選擇Authorize Kinsta授權 Kinsta GitHub 應用程序訪問您的 GitHub 帳戶。

最後,GitHub 會將您的瀏覽器重定向到 MyKinsta,以便繼續設置應用程序。

將 MyKinsta 與 GitHub 連接
連接 MyKinsta 和 GitHub 的屏幕截圖。

連接到 GitHub 後,您將看到“添加應用程序”彈出窗口/模式,其中有一個用於選擇 GitHub 存儲庫的下拉菜單。 單擊GitHub 存儲庫字段並在下拉列表中選擇編輯 GitHub 權限

將應用程序添加到 MyKinsta
將應用程序添加到 MyKinsta 的屏幕截圖。

這將在您的瀏覽器中打開一個新選項卡到 GitHub 網頁,您可以在其中選擇 Kinsta 將能夠訪問的數據。 不要啟用對所有存儲庫的訪問,而是考慮僅選擇您希望 Kinsta 使用的存儲庫。 單擊Only select repositories ,然後選擇您要部署的存儲庫。

在 GitHub 上安裝 MyKinsta
在 GitHub 上安裝 MyKinsta 的屏幕截圖。

然後,點擊Install ,一切就緒!

當您返回 MyKinsta 並單擊GitHub 存儲庫字段時,授權存儲庫應該是可見的。 此外,您可以勾選提交時自動部署複選框,以啟用 MyKinsta 的功能,以便在您對 GitHub 存儲庫進行任何更改後立即自動部署您的應用程序。

為 MyKinsta 選擇存儲庫分支
為 MyKinsta 選擇存儲庫分支的屏幕截圖。

4. 添加應用程序基本信息

您現在可以為應用程序指定一個僅在儀表板中使用的名稱,並從 25 個數據中心位置中進行選擇,從而允許您將應用程序放置在離用戶最近的地理位置。 如果您需要幫助確定哪個數據中心最適合您的應用程序,請查看我們的指南以選擇正確的數據中心位置。

添加應用程序基本詳細信息
添加應用程序基本詳細信息的屏幕截圖。

5.添加環境變量

以下部分用於添加環境變量,最重要的變量是APP_KEY

如果您的.env文件中還沒有密鑰,您可以使用在線 Laravel 密鑰生成器生成一個。 然後,在Key 1字段中插入APP_KEY ,在Value 1字段中插入生成的app key。

最後,選​​擇Available during runtimeAvailable during build process

將環境變量添加到 MyKinsta 應用程序
將環境變量添加到 MyKinsta 應用程序的屏幕截圖。

5.配置編譯環境

這裡神奇的是你不需要配置任何東西! 您可以單擊“繼續”按鈕繼續,瞧! 您已完成構建環境配置。 但是,如果您想增強構建資源以確保更快的構建,您可以從構建資源字段中選擇首選。

構建路徑字段是可選的——您可以將其留空,MyKinsta 將使用根文件夾。

MyKinsta 應用程序構建環境
配置應用程序的構建環境。

6.設置流程和付款方式

對於資源部分,使用以下信息填寫每個字段:

  • 進程名稱:顯示在應用程序進程列表中的名稱。
  • 流程類型:謹慎選擇,因為一旦設置就無法更改。 但是,您可以在部署後在應用程序的進程頁面上添加和更改其他進程,例如後台作業。
  • 啟動命令:您的進程的“啟動”命令(不是必需的)。
  • Pod 大小:您期望您的流程需要的 Pod 容量。
  • 實例數:流程的實例數(最多 50)。

請注意,您可以簡單地單擊繼續而不填寫開始命令字段,因為 Kinsta 在第一次部署期間會自動檢測所需的命令。

MyKinsta 應用程序設置過程
設置應用程序進程的屏幕截圖。

最後一步,查看為您的應用計算的每月使用費用,然後確認您的付款方式。 完成後,單擊確認付款方式按鈕。

確認 MyKinsta 的付款細節
確認付款詳情的屏幕截圖。

你完成了! Kinsta 將在後台完成所有工作來為您的應用程序提供服務。

加載應用的部署過程
加載應用程序部署過程的屏幕截圖。

然後,您將有權訪問所有部署過程的詳細信息,以及臨時實時應用程序 URL,您稍後可以將其替換為您自己的域。

成功部署應用程序
在 MyKinsta 上成功部署 Laravel10 應用程序。

您的 Laravel 10 應用程序現已在 Kinsta 上運行,但是如果您需要在生產環境中進行更改怎麼辦? 如果我們想改變錨標籤的href屬性怎麼辦? 由於我們激活了提交時自動部署功能,MyKinsta 將檢測我們對已部署分支所做的任何更改,並相應地自動更新實時應用程序。

7. 連接 Laravel 10 和 MySQL 數據庫

現在我們已經部署了 Laravel 10 應用程序,我們可以毫不費力地構建一個數據庫並將其鏈接到我們的應用程序。 您所要做的就是單擊左側導航菜單中的應用程序,然後單擊添加服務並選擇數據庫

將新數據庫添加到 MyKinsta
將新數據庫添加到 MyKinsta 的屏幕截圖。

填寫所有字段後,單擊創建數據庫。 這將建立一個新的數據庫,為內部和外部連接做好準備。 在我們的場景中,我們需要與我們部署的 Laravel 10 項目建立內部連接。

為此,您需要做的就是單擊“內部連接”部分中的“添加應用程序”並選擇您的應用程序。 您可以選中將環境變量添加到應用程序複選框,MyKinsta 將填寫您的應用程序需要的所有.env變量。

將數據庫連接到 Laravel 10 應用程序
將數據庫連接到 Laravel 10 應用程序的屏幕截圖。

就這樣,您的 Laravel 10 應用程序已部署並連接到數據庫。

如何為 Laravel 10 做貢獻

儘管 Laravel 由一個核心團隊維護,但它是由超過 3,000 名志願者貢獻者積極開發的。

你想成為這些貢獻者之一併幫助塑造 Laravel 的未來嗎? 如果您回答是,您可以通過添加新功能、修復錯誤甚至重寫文檔中令人困惑的部分來幫助全世界的開發人員。

要為 Laravel 10 做貢獻,你需要做的是:

  1. 前往 Laravel 的 GitHub 存儲庫並查看標題中帶有[10.x]標記的拉取請求。 這將為你提供 Laravel 10 的所有拉取請求的清晰畫面。如果其中一個 PR 解決了你打算做出的貢獻,看看你是否可以改進它。
  2. 如果你計劃的貢獻還沒有被其他人解決,那麼你可以自己創建一個 PR。
  3. 並非所有內容都值得添加到框架代碼庫中。 因此,力求只實現將來易於維護的改進,並能幫助絕大多數 Laravel 社區。
  4. 確保遵守 Laravel 的貢獻指南,以便更好地將您的更改與框架合併。

喜歡 Laravel 10 的另一個原因是它可以讓你通過尋找漏洞為你的貢獻贏錢! 我們接下來會看看那些。

Laravel 10 Bug Hunt 競賽

Laravel 10 漏洞搜尋競賽
Laravel 10 漏洞搜尋競賽。

Laravel 10 宣布了一場精彩的比賽,隨機貢獻者有機會贏得 1,000 美元。

這將是 Laravel 歷史上的第一次此類比賽。 它旨在鼓勵社區查找和修補 Laravel 10 中隱藏的錯誤。

規則很簡單:

  • 只有提交到laravel/framework存儲庫的10.x分支的 PR 才有資格。
  • 只會考慮“真正的”錯誤修復。 不考慮新功能、重構和拼寫錯誤修復。
  • 每個錯誤修復都必須得到測試的支持。
  • 接受的錯誤修復將在 GitHub 上標記,並在比賽結束時隨機宣布獲勝者。

比賽將在 Laravel 10 的第一個穩定版本發佈時結束。 到那時仍未決或在 Laravel 10 發布後提交的任何拉取請求將不合格。

概括

這篇文章不是這樣的! 在發布日期之前會有更多更改。 但就目前而言,Laravel 10 似乎非常有前途,我們很高興介紹它為 PHP 世界帶來的所有禮物。

同時,如果您正在尋找更多提高 Laravel 應用程序性能的方法,您可以考慮切換到高級託管服務提供商。 Kinsta 的應用程序託管解決方案是業內最快、最安全和最容易使用的解決方案之一,它們專門為開發人員設計,提供生產流水線和來自我們經驗豐富的開發人員的 24/7 專家支持。