Bỏ qua đến nội dung chính

Laravel 9 có gì mới? Tóm tắt thay đổi và lịch hỗ trợ

Ghi chú lịch sử phiên bản Laravel 9 (02/2022): các thay đổi chính, cách viết tương ứng ở bản Laravel hiện hành và lời khuyên cho dự án còn chạy Laravel 9.

Tan Hien
Founder
Cập nhật 5 phút đọc
Chia sẻ:
Laravel 9 có gì mới? Tóm tắt thay đổi và lịch hỗ trợ
Nội dung bài viết
  1. 1.Laravel 9 ra mắt khi nào và còn được hỗ trợ không?
  2. 2.Những thay đổi chính của Laravel 9
  3. 2.1PHP 8.0 và Symfony 6.0
  4. 2.2Symfony Mailer thay cho Swift Mailer
  5. 2.3Flysystem 3.x cho facade Storage
  6. 2.4Cú pháp accessor và mutator mới
  7. 2.5Ép kiểu thuộc tính và ràng buộc route bằng Enum
  8. 2.6Nhóm route theo controller
  9. 2.7Ràng buộc route lồng nhau với scopeBindings
  10. 2.8Full text index và whereFullText
  11. 2.9Laravel Scout dùng engine database
  12. 2.10Cải tiến Blade và helper
  13. 2.11Công cụ cho lập trình viên
  14. 3.Dự án đang chạy Laravel 9 nên làm gì?
  15. 3.1Kinh nghiệm từ Hozitech

Laravel 9 phát hành ngày 08/02/2022, là bản lớn đầu tiên ra sau khi Laravel chuyển sang chu kỳ mỗi năm một bản. Laravel 9 yêu cầu PHP 8.0, chuyển sang Symfony Mailer và Flysystem 3.x, thêm cú pháp accessor/mutator mới, hỗ trợ Enum, nhóm route theo controller và engine database cho Scout. Bản này đã hết vá bảo mật từ 06/02/2024.

Bài viết là ghi chú lịch sử phiên bản: tóm tắt chính xác những gì Laravel 9 thay đổi, kèm cách viết tương ứng ở bản hiện hành để bạn đọc code cũ dễ hơn. Nếu bạn mới tìm hiểu framework này, hãy bắt đầu từ bài Laravel là gì và các phiên bản hiện hành.

Infographic 8 thay đổi chính của Laravel 9: PHP 8.0, Symfony Mailer, Flysystem 3, accessor mới, Enum, nhóm route theo controller, Scout database, route:list
Tóm tắt các thay đổi chính của Laravel 9 theo release notes chính thức.

Laravel 9 ra mắt khi nào và còn được hỗ trợ không?

Theo trang Release Notes Laravel 9 (truy cập 01/10/2026):

Thông tinLaravel 9
Ngày phát hành08/02/2022
Phiên bản PHP hỗ trợ8.0 – 8.2
Hết sửa lỗi08/08/2023
Hết vá bảo mật06/02/2024
Bản kế tiếpLaravel 10 (14/02/2023)

Trước Laravel 8, Laravel ra bản lớn mỗi 6 tháng. Từ Laravel 8, đội phát triển chuyển sang mỗi năm một bản lớn; vì vậy Laravel 9 ra sau Laravel 8 khoảng 17 tháng. Hiện bản hiện hành là Laravel 13 (17/03/2026, PHP 8.3+).

Những thay đổi chính của Laravel 9

PHP 8.0 và Symfony 6.0

Laravel 9 yêu cầu tối thiểu PHP 8.0 và dùng các thành phần Symfony 6.0. PHP 8.0 nay đã hết hỗ trợ trên php.net, nên đây cũng là lý do lớn để không giữ dự án ở Laravel 9.

Symfony Mailer thay cho Swift Mailer

Swift Mailer không còn được bảo trì nên Laravel 9 chuyển sang Symfony Mailer. Nếu dự án có code tùy biến sâu phần gửi mail (ví dụ gọi trực tiếp đối tượng Swift), cần sửa theo Upgrade Guide 9.x.

Flysystem 3.x cho facade Storage

Mọi thao tác file qua Storage chạy trên Flysystem 3.x. Khi nâng cấp, nên kiểm tra lại các driver lưu trữ bên thứ ba (S3, FTP…) có bản tương thích.

Cú pháp accessor và mutator mới

Thay vì hai phương thức getNameAttribute / setNameAttribute, Laravel 9 cho phép khai báo một phương thức duy nhất trả về Illuminate\Database\Eloquent\Casts\Attribute. Ở bản hiện hành, tài liệu dùng Attribute::make():

use Illuminate\Database\Eloquent\Casts\Attribute;

protected function firstName(): Attribute
{
    return Attribute::make(
        get: fn (string $value) => ucfirst($value),
        set: fn (string $value) => strtolower($value),
    );
}

Ép kiểu thuộc tính và ràng buộc route bằng Enum

Với PHP 8.1 trở lên, Eloquent ép kiểu cột sang backed Enum; route khai báo kiểu Enum sẽ tự trả 404 nếu giá trị trên URL không hợp lệ. Từ Laravel 11, khung ứng dụng khai báo cast trong phương thức casts():

enum Category: string
{
    case Fruits = 'fruits';
    case People = 'people';
}

Route::get('/categories/{category}', function (Category $category) {
    return $category->value;
});

// Trong model (cách viết hiện hành):
protected function casts(): array
{
    return [
        'status' => ServerStatus::class,
    ];
}

Nhóm route theo controller

Phương thức Route::controller() gom các route dùng chung một controller, mỗi route chỉ cần ghi tên phương thức. Lưu ý đây vẫn là tham chiếu bằng class, không phải chuỗi kiểu cũ 'OrderController@show'.

use App\Http\Controllers\OrderController;

Route::controller(OrderController::class)->group(function () {
    Route::get('/orders/{id}', 'show');
    Route::post('/orders', 'store');
});

Xem thêm cách khai báo route ở bài route trong Laravel.

Ràng buộc route lồng nhau với scopeBindings

Gọi ->scopeBindings() để Laravel chỉ tìm model con thuộc model cha, ví dụ bài viết {post} phải thuộc người dùng {user}, kể cả khi không dùng khóa tùy chỉnh.

Full text index và whereFullText

Với MySQL hoặc PostgreSQL, có thể tạo chỉ mục full text trong migration và truy vấn bằng whereFullText:

$table->text('bio')->fullText();

$users = DB::table('users')
    ->whereFullText('bio', 'web developer')
    ->get();

Laravel Scout dùng engine database

Ứng dụng nhỏ và vừa có thể dùng engine database của Scout (truy vấn "where like" và full text index) thay cho dịch vụ tìm kiếm riêng như Algolia hay Meilisearch.

Cải tiến Blade và helper

  • Blade::render() render một chuỗi template Blade thành HTML.
  • Cú pháp slot ngắn <x-slot:title> thay cho <x-slot name="title">.
  • Directive @checked và @selected cho checkbox và thẻ select.
  • View phân trang Bootstrap 5: gọi Paginator::useBootstrapFive() trong AppServiceProvider.
  • Helper str() (tương đương Str::of()) và to_route() để chuyển hướng tới route có tên.
return Blade::render('Hello, {{ $name }}', ['name' => 'Julian Bashir']);

$string = str('Taylor')->append(' Otwell'); // 'Taylor Otwell'

return to_route('users.show', ['user' => 1]);

Công cụ cho lập trình viên

  • Lệnh php artisan route:list hiển thị lại dễ đọc hơn.
  • php artisan test --coverage hiển thị độ phủ test, kèm --min để đặt ngưỡng tối thiểu.
  • Trang lỗi Ignition được thiết kế lại, có giao diện sáng/tối.
  • Laravel Breeze có chế độ API kèm bản frontend Next.js.
  • Kiểm tra mảng lồng nhau bằng Rule::forEach; xem thêm các quy tắc validation phổ biến trong Laravel.

Dự án đang chạy Laravel 9 nên làm gì?

Laravel 9 và PHP 8.0 đều đã hết vá bảo mật. Nên nâng cấp tuần tự 9 → 10 → 11 → 12 → 13, mỗi bước đọc Upgrade Guide của bản đích và chạy lại test. Bước tiếp theo sau Laravel 9 được tóm tắt trong bài các thay đổi của Laravel 10. Với dự án mới, hãy khởi tạo trực tiếp bằng bản hiện hành theo hướng dẫn cài đặt Laravel.

Kinh nghiệm từ Hozitech

Hozitech xây dựng website trên Laravel và bàn giao mã nguồn cho khách hàng. Với dự án cũ, chúng tôi kiểm tra phiên bản framework, phiên bản PHP của hosting và các gói bên thứ ba trước khi nâng cấp, vì gói ngừng phát triển thường là điểm nghẽn lớn hơn bản thân Laravel.

Tan Hien

Về tác giả

Founder

Xin chào mình là Hiền hiện đang là Founder của Hozitech. Mình là kỹ sư phần mềm có hơn 9+ năm kinh nghiệm trong lĩnh vực thiết kế website, ứng dụng di động... Gần đây mình đang nghiên cứu thêm về lĩnh vực marketing. Mình rất vui khi được chia sẽ những kiến thức và kinh nghiệm của mình đến mọi người!

Câu hỏi thường gặp

Câu hỏi thường gặp

Sẵn sàng bắt đầu dự án của bạn?

Hãy để chúng tôi giúp bạn biến ý tưởng thành hiện thực. Đăng ký tư vấn miễn phí ngay hôm nay để nhận được giải pháp công nghệ tối ưu cho doanh nghiệp.