Laravel 10 đã ra mắt! Dưới đây là tất cả các tính năng mới và những thay đổi.

Cập nhật vào

Mục luc:

Laravel 10 đã ra mắt! Dưới đây là tất cả các tính năng mới và những thay đổi.

Giới thiệu

Laravel 9 đã lỗi thời. Framework này đã có một phiên bản thứ 10 mới toanh, và mình sẽ kể bạn nghe mọi thứ về nó.

Ngày phát hành phiên bản Laravel 10

Laravel 10 được phát hành vào ngày 14 tháng 2 năm 2023 và hiện đang là phiên bản mới nhất của framework này. Nhưng hãy điềm tĩnh! Điều này không có nghĩa là bạn phải cập nhật tất cả các dự án của mình ngay lập tức.

Laravel 9 sẽ tiếp tục nhận sửa lỗi cho đến ngày 23 tháng 8 năm 2023 và nhận bảo mật cho đến ngày 6 tháng 2 năm 2024.

Phiên bản PHP Ngày phát hành Sửa lỗi đến Bảo mật đến
9 8.0 8.1 8 tháng 2 năm 2022 8 tháng 8 năm 2023 6 tháng 2 năm 2024
10 8.1 - 8.2 14 tháng 2 năm 2023 6 tháng 8 năm 2024 4 tháng 2 năm 2025

Laravel 10 có phải là LTS (Long Term Support)?

Không, Laravel 10 không phải là LTS, nhưng nó cung cấp hai năm hỗ trợ.

Phiên bản framework cuối cùng có LTS là phiên bản 6 và bạn có thể tìm hiểu thêm về các phiên bản LTS tại đây.

Như mình đã từng chia sẻ, mỗi phiên bản chính đều cung cấp hai năm sửa lỗi và bảo mật, đó là đủ thời gian để chuẩn bị ứng dụng của bạn để nâng cấp lên phiên bản chính tiếp theo.

Cách cài đặt Laravel 10 như sau:

Sử dụng trình cài đặt chính thức của Laravel:

1laravel new hello-world

Hoặc, nếu bạn thích sử dụng Composer:

1composer create-project --prefer-dist laravel/laravel hello-world\

Làm thế nào để nâng cấp lên Laravel v10?

Việc nâng cấp lên Laravel 10 đòi hỏi nhiều hơn chỉ là làm theo hướng dẫn nâng cấp. Trước khi tiến hành, hãy cân nhắc kỹ lưỡng.

Hãy xem hướng dẫn về cách nâng cấp lên Laravel 10 nếu bạn cần thêm thông tin về quá trình và những điều cần xem xét trước khi quyết định. Mình cũng sẽ giới thiệu một giải pháp đơn giản hơn để tự động hóa quá trình nâng cấp, điều này sẽ rất hữu ích đối với các doanh nghiệp.

Những điều mới trong Laravel 10: các tính năng và thay đổi

Laravel Pennant: một gói tính năng chuyển đổi chức năng (Feature Flags) chính thức cho Laravel 10

Laravel Pennant là một gói tính năng chính thức, giúp thêm tính năng chuyển đổi chức năng vào bất kỳ dự án Laravel 10 nào.

1composer require laravel/pennant

Feature flags là một cách để bật hoặc tắt tính năng trong quá trình chạy mà không cần thay đổi mã nguồn.

Ví dụ, bạn có thể triển khai một tính năng chỉ cho một nhóm người dùng cụ thể trong môi trường production. Điều này rất hữu ích cho việc thử nghiệm A/B.

1use Laravel\Pennant\Feature;
2use Illuminate\Support\Lottery;
3 
4Feature::define('new-onboarding-flow', function () {
5return Lottery::odds(1, 10);
6});

Kiểm tra xem người dùng có quyền truy cập vào tính năng hay không:

1if (Feature::active('new-onboarding-flow')) {
2//
3}

Thậm chí còn có một Blade directive:

1@feature('new-onboarding-flow')
2
3@endfeature

Tìm hiểu thêm về Laravel Pennant trong tài liệu chính thức.

Laravel News cũng có một hướng dẫn chi tiết.

Xử lý các tiến trình bên ngoài dễ dàng

Laravel 10 đã giới thiệu một API đơn giản nhưng toàn diện cho thành phần Symfony Process, cho phép bạn chạy các tiến trình bên ngoài trong ứng dụng Laravel của bạn một cách dễ dàng. Và mình rất thích điều này!

Chức năng xử lý tiến trình trong Laravel được thiết kế để phục vụ các tình huống sử dụng phổ biến nhất, mang đến trải nghiệm tuyệt vời cho các nhà phát triển. 🔥

Dưới đây là cách bạn sử dụng nó:

1use Illuminate\Support\Facades\Process;
2 
3$result = Process::run('ls -la');
4 
5return $result->output();

Bạn thậm chí có thể chạy các tiến trình song song. Mình rất thích lợi ích mà Laravel HTTP client mang lại.

1use Illuminate\Process\Pool;
2use Illuminate\Support\Facades\Pool;
3 
4[$first, $second, $third] = Process::concurrently(function (Pool $pool) {
5$pool->command('cat first.txt');
6$pool->command('cat second.txt');
7$pool->command('cat third.txt');
8});
9 
10return $first->output();

Còn nhiều điều để tìm hiểu về các tiến trình trong tài liệu chính thức.

Nhận diện các bài tests chạy chậm

Lệnh Artisan php artisan test trong Laravel 10 hiện đã có thể nhận tùy chọn --profile, cho phép bạn dễ dàng xác định các bài kiểm tra chạy chậm nhất.

Mình rất vui vì điều này, đây thực sự là một tính năng hết sức hữu ích.

Lệnh này được cung cấp bởi gói nunomaduro/collision phiên bản thứ 7. Hãy đảm bảo rằng bạn đã thực hiện các thay đổi cần thiết nếu bạn đã nâng cấp từ Laravel 9.

Laravel v10 mặc định sử dụng các quy tắc xác thực khả gọi (invokable)

Trong Laravel 9, các quy tắc xác thực khả gọi có thể được tạo ra bằng cách sử dụng tùy chọn --invokable với lệnh php artisan make:rule. Tuy nhiên, bắt đầu từ Laravel 10, bạn không cần sử dụng tùy chọn này nữa.

1php artisan make:rule Uppercase

Để giúp bạn nhớ lại một chút về quy tắc xác thực khả gọi, dưới đây là ví dụ về cách chúng được viết:

1namespace App\Rules;
2 
3use Illuminate\Contracts\Validation\InvokableRule;
4 
5class Uppercase implements InvokableRule
6{
7 /**
8 * Run the validation rule.
9 *
10 * @param string $attribute
11 * @param mixed $value
12 * @param Closure(string): Illuminate\Translation\PotentiallyTranslatedString $fail
13 * @return void
14 */
15 public function __invoke($attribute, $value, $fail)
16 {
17 if (strtoupper($value) !== $value) {
18 $fail('The :attribute must be uppercase.');
19 }
20 }
21}

Mã mẫu đã được rút gọn đáng kể và dễ hiểu hơn so với cách trước đây. Nhờ Laravel 10, mình nghĩ rằng mọi người sẽ không còn sợ hãi khi phải tạo các quy tắc xác thực tùy chỉnh.

Skeleton Laravel 10 sử dụng kiểu dữ liệu nguyên thuỷ thay vì docblocks

Bắt đầu từ Laravel 10, skeleton sẽ sử dụng kiểu dữ liệu nguyên thuỷ thay vì docblocks.

Ví dụ, trong skeleton Laravel, phương thức schedule() trong file app/Console/Kernel.php sẽ trông như sau:

1/**
2 * Define the application's command schedule.
3- *
4- * @param Illuminate\Console\Scheduling\Schedule $schedule
5- * @return void
6 */
7- protected function schedule($schedule)
8+ protected function schedule(Schedule $schedule): void

Đội ngũ cũng đã thêm các chú thích kiểu chung (generic type annotations), từ đó cải thiện khả năng tự động hoàn thành mã nguồn hơn nữa (với điều kiện trình biên tập mã của bạn hỗ trợ generics).

Các gói Laravel chính thức cũng sử dụng kiểu dữ liệu nguyên thuỷ

Các gói chính thức cho Laravel sẽ không bị bỏ qua trong quá trình chuyển đổi này.

Kiểu dữ liệu nguyên thuỷ sẽ được sử dụng trên toàn bộ tổ chức Laravel.

Bạn có thể kiểm tra PR này, khởi đầu việc chuyển từ dockblocks sang native type hints trong Laravel Jetstream.

Laravel 10 cho phép bạn tùy chỉnh đường dẫn của các tệp cấu hình

Một người đóng góp cho dự án Laravel đã thêm khả năng thiết lập đường dẫn tùy chỉnh cho các tệp cấu hình. Điều này hữu ích cho các dự án chuyển đổi từ từ sang Laravel mà không thể xử lý một thay đổi cấu trúc thư mục một cách toàn diện.

Trong tệp bootstrap/app.php của bạn, sử dụng phương thức configPath() từ đối tượng $app.

1$app->configPath(DIR . '/../some/path');

(Và bạn có biết về bootstrapPath(), databasePath(), langPath(), v.v.? Laravel có khả năng tùy chỉnh cao.)

Tìm hiểu thêm: Tùy chỉnh đường dẫn cấu hình

doctrine/dbal không còn cần thiết để thay đổi cột trong migrations

Thao tác thay đổi cột được thực hiện trong migrations như sau:

1
2 
3return new class extends Migration
4{
5 public function up()
6 {
7 Schema::table('foo', function (Blueprint $table) {
8 $table->unsignedBigInteger('bar')->change();
9 });
10 }
11 
12
13}

Trong Laravel 9, bạn phải cài đặt doctrine/dbal để thực hiện công việc này. Nhưng bây giờ, migrations hỗ trợ các hoạt động nguyên thuỷ được cung cấp bởi hầu hết các cơ sở dữ liệu mà Laravel hỗ trợ.

Giả sử bạn có nhiều kết nối cơ sở dữ liệu và đã cài đặt Doctrine DBAL. Trong trường hợp đó, bạn nên gọi Schema::useNativeSchemaOperationsIfPossible() để sử dụng các hoạt động nguyên thuỷ trước khi rơi vào việc sử dụng gói (ví dụ: SQLite vẫn chưa hỗ trợ điều này).

1use Illuminate\Support\Facades\Schema;
2 
3
4 
5class AppServiceProvider extends ServiceProvider
6{
7 public function boot()
8 {
9 Schema::useNativeSchemaOperationsIfPossible();
10 }
11}

Tìm hiểu thêm:

Laravel 10 yêu cầu ít nhất Composer 2.2

Composer 1.x đã bị loại bỏ vào năm 2021.

Do đó, để đảm bảo nền tảng vững chắc cho mọi dự án Laravel 10 mới, Nuno Maduro đề xuất yêu cầu ít nhất Composer 2.2 (phát hành vào tháng 12 năm 2021), cũng là một phiên bản LTS được cập nhật cho đến cuối năm 2023 (Composer đang ở phiên bản 2.5.3 vào thời điểm mình viết những dòng này).

Tìm hiểu thêm: Yêu cầu Composer ^2.2

Dừng hỗ trợ cho PHP 8.0

Laravel 10 ngừng hỗ trợ PHP 8.0 và yêu cầu tối thiểu là PHP 8.1, điều này có nghĩa nếu bạn muốn nâng cấp:

  • Hoặc chuyển đổi sang PHP 8.1
  • Hoặc PHP 8.2 Nhưng hãy nhớ: ứng dụng Laravel của bạn không cần phải được cập nhật lên phiên bản mới nhất ngay khi chúng được phát hành.

Đặc biệt nếu bạn có các dự án với khách hàng trả phí hoặc nhân viên phụ thuộc vào chúng để thực hiện công việc của mình.

Họ cần di chuyển từ từ nhưng chắc chắn bằng cách thực hiện kiểm thử một cách kỹ lưỡng. Đừng vội vàng.

Xem pull request trên GitHub: Loại bỏ PHP 8.0

Dừng hỗ trợ Predis v1

Nếu bạn đang buộc việc sử dụng Predis v1 trong dự án của mình, bạn có thể muốn nâng cấp lên phiên bản v2.

Để xem những thay đổi trong Predis v2, hãy xem changelog.

Xem pull request trên GitHub: Loại bỏ hỗ trợ Predis v1

Theo ý kiến của mình, thay vì sử dụng Predis, bạn nên xem xét sử dụng phần mở rộng Redis nguyên thuỷ của PHP, nó nhanh hơn và có thể làm tăng tốc độ trang web của bạn nếu bạn có lượng truy cập lớn.

dispatchNow() đã bị loại bỏ khỏi Laravel 10

dispatchNow() là một phương thức phổ biến trong Laravel. Nó đã bị loại bỏ từ Laravel 9 và được thay thế bằng dispatchSync(). Laravel 10 sẽ loại bỏ hoàn toàn dispatchNow(), vì vậy hãy chắc chắn tìm kiếm và thay thế nó trong tất cả các dự án của bạn. Điều này có thể là một thay đổi gây mất tương thích, nhưng đó là một vấn đề dễ dàng để khắc phục.

Xem pull request trên GitHub: Loại bỏ chức năng dispatchNow

Các phương thức và thuộc tính đã bị loại bỏ được đánh dấu là không còn hợp lệ trong Laravel 10.

Việc phát hành phiên bản chính cũng đồng nghĩa với việc nhóm phát triển Laravel cuối cùng cũng có thể loại bỏ các tính năng đã bị đánh dấu là không còn hợp lệ trong Laravel 9. Điều này cũng có nghĩa là bạn nên kiểm tra kỹ lưỡng bất kỳ ứng dụng Laravel nào bạn muốn di chuyển lên phiên bản 10.

Dưới đây là danh sách các PRs phục vụ cho việc này:

Vậy là mình và các bạn vừa điểm lại các điểm thay đổi đáng chú ý trong Laravel 10 rồi! Chúc các bạn có những trải nghiệm tuyệt vời với phiên bản này nhé! Cảm ơn các bạn đã đọc bài!

Recommended