Laravel 11 發布 新功能 PHP 8.2 Laravel Reverb WebSocket
Laravel PHP

Laravel 11 發布與新功能!最低要求 PHP 8.2,檔案結構已大改,Laravel Reverb 套件支援 WebSocket

商業,創業,業務,職涯,美食,葡萄酒,閱讀,網路科技。
從 Larry 創業以及商業的經驗,希望以白話的口吻,介紹給大家這個商業的世界。
FB粉專 Larry的午茶時光 會頻繁地更新 Larry 對於商業、社會、人生的觀察與心得,歡迎大家追蹤互動~

https://laravel-news.com/laravel-11
前幾天 (2024年3月中) Laravel 11 發布了。要先提醒讀者的是,Laravel 11 是一個超大的改版,要不要使用 Laravel 11 要再三思。

以下是 Laravel 11 的一些主要更新和新功能:

PHP 8.2 是 Laravel 11 最低的 PHP 版本要求

Laravel 目前的策略看起來是跟著 PHP 的最新版本。Laravel 9 要求 PHP 8.0,Laravel 10 要求 PHP 8.1,Laravel 11 要求 PHP 8.2。

但這個策略會有一個副作用:系統廠商跟開發者不可能隨時都去更新 PHP 版本,設限一個這麼高的 PHP 版本,反而會限制新版 Laravel 的普及。

Streamlined Directory Structure (簡化以及提高效率)

bootstrap/app.php 檔案重寫,而且專案層級的設定會寫在這裡 (Laravel 10 以前這個檔案根本不會打開)。

一些專案層級的 routing, middleware, service providers, exception handling 等,都在這個檔案設定,而不是散落在專案四處。

Laravel 10 app/Providers 底下有 5 個 providers,Laravel 11 app/Providers 底下只有 AppServiceProvider。之前其他 service provider 的功能整合到 bootstrap/app.php,或是直接在 AppServiceProvider 中設定。

舉例來說,auth policy 之前是註冊在 AuthServiceProvider,Laravel 11 是註冊在 AppServiceProvider。

routes/api.phproutes/channels.php 已被移除,因為很多應用並沒有用到這些檔案。當然,可以用 artisan 指令新增回來。

app/Http/Middleware 整個資料夾不見了!現在都在 bootstrap/app.php 中設定 (withMiddleware closure)。

app/Http/Kernel.php 也移除了!因為它的功能本來就是管理 middleware,現在 Middleware 整個資料夾都不見了,當然也不需要 Kernel.php 了。

app/Console 整個資料夾也不見了!scheduled tasks 直接寫在 routes/console.php (它預設還在)。如果是用 artisan 指令新增 command,仍然會在 app/Console/Commands 底下。

app/Exceptions 整個資料夾也不見了!exception handling 的設定就直接寫在 bootstrap/app.php

app/Http/Controllers/Controller.php 變成一個空的 abstract class,不再 extends 任何東西。

預設的 database 變成 SQLite (而不是 MySQL)

SQLite database 其實就是一個檔案,當然比 MySQL 輕量、跨平台,以及更低的軟體相依性。但目前 MySQL 還是最多人使用的 database,使用 MySQL 的開發者要記得 DB 設定要切到 MySQL。

新增 Laravel Reverb 套件支援 WebSocket

Laravel Reverb 是一個支援 WebSocket 的套件。傳統 HTTP 是一問一答,但如果 client 不問,並不會知道主機資料已經變化。所以傳統是用「輪詢」(Polling) 的方式,例如每幾秒、每幾分鐘問一次主機。

經由 WebSocket 後主機可以主動通知 client:主機資料已經改變了。實際應用場景包含訊息推播、即時訊息更新,等等。client 端不需詢問主機或重整網頁。

Per-second rate limiting

之前 rate limiting 是寫在 App\Providers\RouteServiceProvider,而且只能以「每分鐘」為單位來限制。

Laravel 11 沒有 RouteServiceProvider,所以是寫在 AppServiceProvider,而且可以「每秒鐘」為單位來限制。
https://laravel.com/docs/11.x/routing#rate-limiting

Health routing

定義在 bootstrap/app.php,有一個 /up,方便第三方 health check 軟體,例如 Kubernetes 來使用。當 request /up 時,Laravel 會發一個 DiagnosingHealth event,開發者可以接這個 event,再做一些確認健康動作。

Encryption Key Rotation

Laravel 會加密所有 cookie,包含 session cookie。Laravel 11 新增一個環境變數 APP_PREVIOUS_KEYS。開發者可以將之前用來加密的 key (多筆),以逗號分隔的方式,存在 APP_PREVIOUS_KEYS

Laravel 仍會用 APP_KEY 加密,解密時仍會先用 APP_KEY,不行時再從 APP_PREVIOUS_KEYS 中一一嘗試。

這樣開發者就可以更改 APP_KEY,並將舊的 key 放在 APP_PREVIOUS_KEYS,而不影響所有使用者操作。

Automatic Password Rehashing

Laravel 是以 bcrypt 加密密碼,其中有一個參數 BCRYPT_ROUNDS,在 config/hashing.php 中使用。當開發者重新設定環境變數 BCRYPT_ROUNDS 後,當使用者登入或 auth,Laravel 11 會 re-hash 使用者密碼。

Prompt validator

Laravel Prompts 套件在 Laravel 10.17 加入。用 artisan commands 的方式可以撰寫一些客製的指令以及回覆。

其中可以檢查 console 的輸入值是否 valid。Laravel 11 開始可以使用 validator (request validate 的那種寫法),來檢查 console 的輸入值。

Queue interaction testing

之前如果要對 queued jobs 做單元測試,是非常麻煩的。Laravel 11 開始 queued job 可以生成一個 fake instance,直接在主執行緒上做測試以及 assert。

New artisan commands

這幾個指令終於加到了 artisan command

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

Attribute Casting 的更改

之前是用 property 來設定 casts,Laravel 11 開始請用 method 來設定 casts,這樣在 casts function 裡還可以做複雜的變化 (call 其他 methods)。

https://laravel-news.com/laravel-11 的範例

protected function casts(): array
{
    return [
        'email_verified_at' => 'datetime',
        'password' => 'hashed',
        'options'=› AsEnumCollection::of(UserOption::class),
    ];
}

以上是 Laravel 11 幾個重要的更新。當然在本文上述之外,還有其他的更新。

Laravel 10 之前的更新基本上都是新增功能,或是某個模組的翻新。Laravel 11 則是超大幅度的程式重構,當然寫法也都完全不同。

https://laravel.com/docs/10.x/reverb
另外,新的 Laravel Reverb 套件(支援 WebSocket),需要 Laravel 10.47 以上,以及 PHP 8.2 以上。

Laravel 11 本身有超大幅度的程式重構,主機環境也需要 PHP 8.2 以上。開發者如果要使用 Laravel 11,要想清楚喔。

商業,創業,業務,職涯,美食,葡萄酒,閱讀,網路科技。
從 Larry 創業以及商業的經驗,希望以白話的口吻,介紹給大家這個商業的世界。
FB粉專 Larry的午茶時光 會頻繁地更新 Larry 對於商業、社會、人生的觀察與心得,歡迎大家追蹤互動~