Nội dung bài viết
- 1.Laravel 9 ra mắt khi nào và còn được hỗ trợ không?
- 2.Những thay đổi chính của Laravel 9
- 2.1PHP 8.0 và Symfony 6.0
- 2.2Symfony Mailer thay cho Swift Mailer
- 2.3Flysystem 3.x cho facade Storage
- 2.4Cú pháp accessor và mutator mới
- 2.5Ép kiểu thuộc tính và ràng buộc route bằng Enum
- 2.6Nhóm route theo controller
- 2.7Ràng buộc route lồng nhau với scopeBindings
- 2.8Full text index và whereFullText
- 2.9Laravel Scout dùng engine database
- 2.10Cải tiến Blade và helper
- 2.11Công cụ cho lập trình viên
- 3.Dự án đang chạy Laravel 9 nên làm gì?
- 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.

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 tin | Laravel 9 |
|---|---|
| Ngày phát hành | 08/02/2022 |
| Phiên bản PHP hỗ trợ | 8.0 – 8.2 |
| Hết sửa lỗi | 08/08/2023 |
| Hết vá bảo mật | 06/02/2024 |
| Bản kế tiếp | Laravel 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
@checkedvà@selectedcho checkbox và thẻ select. - View phân trang Bootstrap 5: gọi
Paginator::useBootstrapFive()trongAppServiceProvider. - Helper
str()(tương đươngStr::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:listhiển thị lại dễ đọc hơn. php artisan test --coveragehiể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.
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