在瘋狂流行的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將得到bug修復,直到2024年8月6日和安全修復,直到2025年2月4日。
- Laravel 11預計在2025年8月4日之前會得到bug修復,在2026年2月2日之前會得到安全修復。
你應該升級到Laravel 10嗎?
重要的是要記住,我們並不總是需要在新版本釋出後立即將我們應用程式的Laravel版本升級到最新版本。
Laravel是一個開源的框架, 這意味著每次我們在機器上安裝一個新的Laravel例項時, 我們都擁有這個框架的程式碼庫. 這意味著,即使我們的應用程式使用的框架版本不再支援,應用程式仍然可以工作,只是我們必須自己維護它。
因此,人們普遍建議,應用程式的穩定性應優先於框架的升級。
簡而言之, 你應該考慮升級到Laravel 10,當:
- 應用在當前的版本下是穩定的, 並且執行沒有問題.
- 新版本要麼增加了一個你的應用程式需要的功能,要麼修復了一個你的應用程式正在經歷的問題。
- 在升級變化推送到生產中之前,應用程式將被很好地測試。
Laravel 10更新熱點
Laravel 10標誌
正如你已經知道的, Laravel 10還沒有釋出. 然而, 我們將保持這篇文章的更新,提供所有關於預期釋出的新鮮資訊。因此, 我們建議把這個頁面加入書籤,並不時地重溫一下。
Laravel 10的新功能和更新
毫無疑問,任何新版本最令人興奮的部分是增加了新的功能。所以不用多說, 讓我們先來看看Laravel 10的新功能和更新。
1. PHP 8.1: 在Laravel 10的核心
PHP 8.1是Laravel 10中最低要求的PHP版本。根據Laravel 9分支和GitHub上的框架主分支的比較,一些PHP 8.1的功能,如 readonly
屬性和 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做好準備。
事實上, 整個Laravel生態系統, 包括Forge, Vapor, 和Envoyer, 都支援PHP 8.2, 而且你甚至可以在Laravel 9中使用PHP 8.2。這有多酷啊!
3. Laravel入門套件升級
Laravel Breeze和Jetstream已經準備好使用Laravel 10,一旦它被髮布。此外, 他們也已經升級到Inertiajs 1了,JetStream有一個驚喜,就是完全支援黑暗模式。
4. Predis版本升級
Predis是一個強大的Redis客戶端,用於PHP,可能會幫助你獲得最大的快取,以提供一個美妙的使用者體驗。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
上面的程式碼將成功地改變列的型別,但也會放棄 UNSIGNED
, DEFAULT
和 COMMENT
屬性。因此,當你改變一個列的型別時,記住新增所有的屬性是很重要的:
$table->bigInteger('user_balance')->unsigned()->default(0)->comment('balance')->change();
在你有多個資料庫連線並且已經安裝了 doctrine/dbal
的情況下,建議在 App\Providers\AppServiceProvider
的 boot
方法中呼叫 Schema::useNativeSchemaOperationsIfPossible()
方法,以便能夠使用本地模式操作,在依賴包之前使用本地操作(例如,SQLite還不支援這個):
use IlluminateSupportFacadesSchema; class AppServiceProvider extends ServiceProvider { public function boot() { Schema::useNativeSchemaOperationsIfPossible(); } }
8. 列型別的本地檢索
Laravel 10的另一個值得注意的特點是能夠使用 Schema::getColumnType
方法,而不需要依賴 doctrine/dbal
包。目前我們使用 Schema::getColumnType
和 doctrine/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 10棄用方法和刪除
我們可以看到,Laravel核心團隊正在從Laravel 10分支中刪除Laravel 9中的棄用方法。我們預測團隊會在Laravel 10釋出後儘快更新文件的升級指南,以包括所有棄用的方法和包。
如果你要把目前的專案遷移到Laravel 10,任何使用棄用方法的程式碼都應該用新的方法重新編寫,以達到相同的效果。
下面是我們在比較Laravel 9和主分支時發現的所有棄用和刪除的列表:
Route::home
方法(在Laravel 9中被棄用)- 圍繞
dispatchNow
的棄用函式和方法. 這是為了鼓勵開發人員使用dispatchSync
,這是唯一支援的立即排程的方式。 getBaseQuery
,因為它有一個toBase等價物。- 不再使用的
MaintenanceModeException
類 MocksApplicationServices
特質- mail fake的
Mail::failures
方法 - 被棄用的
$dates
屬性,建議使用$casts代替 assertTimesSent()
方法- 放棄了對
Predis
1 和doctrine/dbal
2的支援 - 自從Laravel放棄對版本2的支援後,
doctrine/dbal
中所有相關的棄用。
如何安裝Laravel 10
Laravel 10現在已經可以使用了, 你可以去體驗和測試它的功能. 在Laravel安裝程式中的 –dev
標誌會安裝來自 laravel/laravel
倉庫的主分支。你所要做的就是在你的終端執行這個命令:
laravel new example-wbolt-app --dev
或者,如果你喜歡使用Composer:
composer create-project --prefer-dist laravel/laravel example-wbolt-app dev-master
為了更好地理解Composer命令,這裡有一個快速解釋:
- laravel/laravel:用於安裝Laravel的軟體包
- example-kinsta-app::你的新專案的新目錄(可以改變)
- dev-master:Laravel的下一個版本(在這個例子中, Laravel 10)
安裝Laravel 10後, 你可以通過導航到新目錄example-wbolt-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擴充套件
- cURL PHP擴充套件
- DOM PHP擴充套件
- Fileinfo PHP擴充套件
- JSON PHP擴充套件
- Mbstring PHP擴充套件
- OpenSSL PHP擴充套件
- PCRE PHP擴充套件
- PDO PHP擴充套件
- Tokenizer PHP擴充套件
- XML PHP擴充套件
如何為Laravel 10做貢獻
雖然Laravel是由一個核心團隊維護的, 但它是由超過3000個志願者貢獻者積極開發的.
你想成為這些貢獻者中的一員,幫助塑造Laravel的未來嗎?如果你的回答是肯定的, 你可以幫助全世界的開發者增加一個新的功能, 修復一個錯誤, 甚至改寫文件中混亂的部分.
要想為Laravel 10做出貢獻, 你需要做的是以下幾點:
- 前往Laravel的GitHub倉庫,檢視標題中標有
[10.x]
的拉動請求。這將使你清楚地瞭解Laravel 10的所有拉動請求。如果其中有一個PR是針對你打算做的貢獻的, 看看你是否可以改進它. - 如果你計劃的貢獻還沒有被別人解決, 那麼你可以自己建立一個PR.
- 不是所有的東西都值得新增到框架程式碼庫中。因此, 爭取只實現那些在未來容易維護的改進, 並能幫助絕大多數Laravel社羣的人.
- 確保遵守Laravel的貢獻指南,以獲得更好的機會讓你的修改被合併到框架中。
喜歡Laravel 10的另一個原因是,它允許你通過bug hunts為你的貢獻贏得金錢! 我們接下來會看一下這些。
Laravel 10 獵蟲大賽
Laravel 10 獵蟲大賽
Laravel 10宣佈了一個很好的比賽,其中一個隨機的貢獻者有機會贏得1000美元。
這將是Laravel歷史上第一次這樣的比賽。它的目的是鼓勵社羣發現和修補Laravel 10中隱藏的bug。
規則很簡單:
- 只有提交到
laravel/framework
倉庫的10.x分支的PR才有資格。 - 只有 “真正的 “錯誤修復才會被考慮。新功能, 重構, 和錯別字的修復是不被考慮的.
- 每個錯誤修復都必須有測試支援。
- 被接受的錯誤修復將在GitHub上進行標註,並在比賽結束時隨機宣佈一個獲勝者。
比賽將在Laravel 10的第一個穩定版本釋出時結束. 任何拉動請求,如果到那時仍在等待或在Laravel 10釋出後提交,將沒有資格參加。
小結
這不是這篇文章的全部內容! 直到釋出日期,還會有更多的變化。但就目前而言, Laravel 10似乎是非常有前途的, 我們很高興能介紹它給PHP世界帶來的所有禮物.
評論留言