Có Gì Mới Trong Laravel 13: Tổng Hợp Những Thay Đổi Quan Trọng
Laravel 13 chính thức ra mắt hôm nay! Đây là bản phát hành lớn tiếp theo sau Laravel 12, mang đến nhiều tính năng mạnh mẽ và những cải tiến đáng kể. Hãy cùng điểm qua những thay đổi quan trọng nhất mà bạn cần biết.
Yêu Cầu Hệ Thống
Trước khi nâng cấp, hãy kiểm tra các yêu cầu cơ bản:
| Thành phần | Yêu cầu tối thiểu |
|---|---|
| PHP | 8.3+ (khuyến nghị 8.4) |
| Composer | 2.8+ |
| Node.js | 20+ |
Laravel 13 chính thức drop support cho PHP 8.2, vì vậy đây là thời điểm tốt để nâng cấp PHP nếu bạn chưa làm.
1. Starter Kit Được Cải Tiến Toàn Diện
Laravel 13 làm mới hoàn toàn starter kit với nhiều lựa chọn hơn:
laravel new my-app
Bạn sẽ được chọn giữa các stack:
- React + TypeScript (với Inertia v2)
- Vue + TypeScript (với Inertia v2)
- Livewire + Volt (mặc định)
- API Only (không có frontend)
Mỗi starter kit đi kèm với WorkOS AuthKit hoặc Laravel's built-in auth để xác thực, cùng với Tailwind CSS v4 được cấu hình sẵn.
2. Eloquent: Typed Model Attribute
Một trong những thay đổi được chờ đợi nhất — Eloquent model giờ hỗ trợ typed attribute khai báo rõ ràng:
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Attributes\Column;
class Post extends Model
{
#[Column(type: 'string')]
public string $title;
#[Column(type: 'datetime')]
public Carbon $published_at;
#[Column(type: 'boolean')]
public bool $is_active;
}
IDE sẽ nhận biết type ngay lập tức mà không cần PHPDoc hay @property. Điều này kết hợp tuyệt vời với PHP 8.4 Property Hook.
3. Fluent Validation Rule
Validation rule giờ đây có thể chain fluent hơn:
use Illuminate\Validation\Rule;
$rules = [
'email' => Rule::string()->email()->unique('users')->max(255),
'age' => Rule::integer()->min(18)->max(120),
'role' => Rule::string()->in(['admin', 'editor', 'viewer']),
];
Không còn cần nối | hay mảng lộn xộn. Code trở nên rõ ràng, dễ đọc, và IDE-friendly hơn rất nhiều.
4. Cải Tiến Artisan Console
Interactive Menu
php artisan make:model
Giờ hiển thị menu tương tác cho phép bạn chọn:
- Tạo migration kèm theo
- Tạo factory
- Tạo seeder
- Tạo policy
- Tạo controller (resource/API/invokable)
artisan inspect
Lệnh mới giúp kiểm tra nhanh trạng thái ứng dụng:
php artisan inspect
# Output:
# Laravel 13.0.0 | PHP 8.4.18
# Environment: production
# Cache: file (hit rate: 94.2%)
# Queue: redis (3 pending, 0 failed)
# Routes: 48 registered
# Models: 12 detected
5. Queue Batching Nâng Cấp
Batch giờ hỗ trợ conditional branching — tiếp tục xử lý dựa trên kết quả:
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;
Bus::batch([
new ProcessOrder($order),
])
->then(function (Batch $batch) {
// Tất cả job thành công
Bus::dispatch(new SendConfirmation($batch->data['order_id']));
})
->onPartialFailure(function (Batch $batch) {
// Một số job thất bại, nhưng không phải tất cả
Bus::dispatch(new NotifyAdmin($batch->failedJobs));
})
->catch(function (Batch $batch) {
// Tất cả đều thất bại
})
->dispatch();
onPartialFailure là callback mới — rất hữu ích cho các batch xử lý đơn hàng hoặc gửi notification hàng loạt.
6. Blade Component Auto-Discovery
Blade component giờ tự động phát hiện — không cần đăng ký thủ công:
resources/views/components/
alert.blade.php → <x-alert />
ui/button.blade.php → <x-ui.button />
forms/input.blade.php → <x-forms.input />
Với class-based component, chỉ cần đặt trong app/View/Components/ và Laravel sẽ tự tìm:
// app/View/Components/Ui/Card.php
// Tự động có sẵn: <x-ui.card />
Không còn cần gọi Blade::component() trong AppServiceProvider.
7. Caching: Stale-While-Revalidate
Pattern cache mới rất phổ biến trong thế giới web giờ được Laravel hỗ trợ native:
Cache::flexible('posts', [300, 600], function () {
return Post::published()->get();
});
Tham số [300, 600] nghĩa là:
- 0–300 giây: trả về cache ngay
- 300–600 giây: trả về cache cũ cho user, đồng thời refresh ngầm
- Sau 600 giây: buộc tạo mới
Đây là cách tốt nhất để giữ response nhanh mà vẫn đảm bảo dữ liệu tươi.
8. Cải Tiến Testing
assertJsonStructureStrict
$response->assertJsonStructureStrict([
'data' => [
'*' => ['id', 'name', 'email'],
],
]);
Khác với assertJsonStructure, phiên bản strict đảm bảo không có field thừa — hữu ích để kiểm tra API không rò rỉ dữ liệu nhạy cảm.
Parallel Testing Cải Tiến
php artisan test --parallel --processes=8
Laravel 13 tối ưu database seeding trong chế độ parallel, giảm thời gian test suite đáng kể.
9. Route Model Binding Mở Rộng
Hỗ trợ binding nhiều model cùng lúc với custom resolver:
Route::get('/teams/{team}/projects/{project}', function (Team $team, Project $project) {
// $project đã được scope theo $team tự động
})->scopeBindings();
Tính năng scopeBindings() đã có từ trước, nhưng Laravel 13 mở rộng để hỗ trợ nested scope tự động lên đến 3 cấp:
Route::get('/org/{org}/team/{team}/member/{member}', function (
Organization $org,
Team $team,
Member $member
) {
// member thuộc team, team thuộc org — tự động validate
})->scopeBindings();
10. Hiệu Năng
Một số cải tiến hiệu năng nổi bật:
- Route caching nhanh hơn 40% với format serialization mới
- Eloquent hydration nhanh hơn 25% khi load model từ database
- Container resolution cải tiến — giảm overhead khi resolve dependency
- View compilation một lần duy nhất và cache vĩnh viễn (cho đến khi thay đổi)
Nâng Cấp Từ Laravel 12
Sử dụng Laravel Shift là cách nhanh nhất:
# Hoặc nâng cấp thủ công
composer require laravel/framework:^13.0
Các breaking change chính cần lưu ý:
- PHP 8.2 không còn được hỗ trợ
- Một số method deprecated trong L12 đã bị xóa — kiểm tra changelog
- Config file mới — chạy
php artisan config:publishđể cập nhật - Validation rule cũ vẫn hoạt động nhưng sẽ deprecated trong L14
Xem Upgrade Guide để biết đầy đủ chi tiết.
Tổng Kết
Laravel 13 là bản cập nhật tập trung vào developer experience và hiệu năng. Typed model attribute, fluent validation, và stale-while-revalidate cache là ba tính năng mà tôi sẽ áp dụng ngay vào dự án. Nếu bạn đang chạy Laravel 12, nâng cấp là quyết định đúng đắn.
Bạn hào hứng nhất với tính năng nào? Hãy thử nghiệm và chia sẻ trải nghiệm!