Giới thiệu
Sau hơn một thập kỷ kể từ khi giới thiệu vào tháng Sáu năm 2011, Framework Laravel đã trở nên cực kỳ phổ biến. Các phiên bản của Laravel được release hằng năm với những nâng cấp đáng kể.
Mới đây, vào ngày 14 tháng 2 năm 2023, phiên bản Laravel 10 chính thức được phát hành. Chúng ta hãy cùng nhau tìm hiểu xem phiên bản này có những thay đổi và cập nhật gì so với những phiên bản trước nhé.
Kế hoạch release của Laravel
Hiện nay, các phiên bản Laravel được dự kiến release vào Q1 hàng năm.
Đối với tất cả các phiên bản Laravel, các bản fix bug được cung cấp trong 18 tháng và các bản sửa lỗi bảo mật được cung cấp trong 2 năm.
Laravel 10 hỗ trợ PHP phiên bản 8.1-8.2 và không hỗ trợ 8.0.
Những cập nhật trong Laravel 10
1. Native Type Declarations
Trước version 10: sử dụng DocBlocks để làm rõ chức năng của một function và loại parameters hoặc response mong đợi.
/** * Determine whether the user can create models. * * @param User $user * @return IlluminateAuthAccessResponse|bool */ public function create(User $user) { // }
Version 10:
/** * Store a newly created resource in storage. */ public function store(Request $request): View { return view(''); }
Để đảm bảo được sự tương thích ngược của framework (breaking changes), các thuộc tính sẽ được áp dụng cho:
- Dữ liệu trả về (return types)
- Tham số của phương thức (method arguments)
- Loại bỏ một số khai báo types không còn cần thiết ở docblock
- Cho phép có thể khai báo ngay trong các tham số của closure
2. Invokable Validation rules sẽ là mặc định
Trước version 10: Nếu bạn muốn tạo Rule Invokable trong Laravel 9 phải thêm cờ –-invokable khi khai báo.
Version 10: Khi tạo Rule sẽ mặc định là Invokable
# Laravel 9 creates a rule class that implements the
# Illuminate\Contracts\Validation\Rule interface
php artisan make:rule Uppercase # Laravel 9 flag to create an invokable
php artisan make:rule Uppercase --invokable # Laravel 10 creates an invokable rule by default
php artisan make:rule Uppercase
3. Hỗ trợ sửa cột cho CSDL
Nhằm loại bỏ dần nhu cầu sử dụng package doctrine/dbal, một tính năng mới đã được giới thiệu trong Laravel 10 cho phép các nhà phát triển sử dụng phương thức change() để sửa đổi các cột mà không cần các gói bổ sung.
Sử dụng phương thức change() để chỉnh sửa cột.
Ví dụ: Để sửa kiểu dữ liệu từ integer -> bigInt ta làm như sau
# before
$table->integer('user_balance')->unsigned()->default(0)->comment('balance'); # after
$table->bigInteger('user_balance')->unsigned()->default(0)->comment('balance')->change();
Note:
- Cần thêm tất cả thuộc tính của cột khi thay đổi nếu không chúng sẽ bị loại bỏ.
- Nếu đã cài đặt doctrine/dbal, nên khai báo phương thức Schema::useNativeSchemaOperationsIfPossible() trong App/Providers/AppServiceProvider để sử dụng tính năng này. Laravel sẽ ưu tiên nó trước khi sử dụng đến package và không hỗ trợ cho SQLite.
use IlluminateSupportFacadesSchema;
class AppServiceProvider extends ServiceProvider
{ public function boot() { Schema::useNativeSchemaOperationsIfPossible(); }
}
4. Hỗ trợ lấy ra Column Type
Tương tự change(), laravel 10 hỗ trợ phương thức Schema::getColumnType mà không cần đến doctrine/dbal.
Schema::getColumnType('questions', 'contents');
5. Hỗ trợ phương thức whereExists() cho Eloquent ORM
Ở những phiên bản trước, việc sử dụng whereExists() cần sử dụng query lồng nhau.
# previous version
Question::whereExists(function ($query) { $query->from('answers')->whereColumn('asnwers.question_id', 'questions.id');
});
Ở phiên bản 10, ta chỉ cần làm như sau:
# version 10
Question::whereExists( Answer::whereColumn('answers.question_id', 'questions.id')
);
6. Cập nhật SQL Server để sử dụng FETCH và OFFSET cho các query không bao gồm orderBy
Khi chúng ta viết 1 query như sau:
$builder->select('*')->from('questions')->skip(11)->take(10)->orderBy('published_at', 'desc');
Laravel sẽ tạo câu lệnh SQL sử dụng FETCH và OFFSET:
select * from [questions] order by [published_at] desc offset 11 rows fetch next 10 rows only
Tuy nhiên, ở phiên bản trước, nếu loại bỏ orderBy khỏi truy vấn, nó sẽ quay trở lại phương thức bù trừ(offsetting) kết quả cũ:
select * from (select *, row_number() over (order by (select 0)) as row_num from [questions]) as temp_table where row_num between 11 and 20 order by row_num
Nhưng Laravel 10 sẽ sử dụng FETCH và OFFSET ngay cả khi không có orderBy:
select * from [questions] order by (SELECT 0) offset 10 rows fetch next 10 rows only
-> Cải thiện tốc độ truy vấn lên tới 33% và yêu cầu ít bước thực hiện hơn
7. Process Interaction
Process Interaction giúp việc thử nghiệm và chạy các quy trình CLI trở nên dễ dàng.
use IlluminateSupportFacadesProcess;
$result = Process::run('ls -la');
$result->successful();
$result->failed();
$result->exitCode();
$result->output();
$result->errorOutput();
$result->throw();
$result->throwIf(condition);
Process Interaction giúp chúng ta:
- Xử lý đầu ra của process khi nhận được
- Thiết lập Process không đồng bộ
- Tạo ra nhóm các process
- Các tính năng testing phong phú thông qua fake()
- Ngăn chặn ngoại lệ trong quá trình testing
Process là một tính năng mới rất được đầu tư với nhiều phương thức và option được cung cấp. Bạn có thể tìm hiểu chi tiết ở docs về phần này của Laravel
8. Cung cấp 1 package mới - Laravel Pennant
Laravel Pennant cung cấp một cách tiếp cận gọn nhẹ, được sắp xếp hợp lý để quản lý các cờ tính năng của ứng dụng của bạn.
Nó cho phép chúng ra tự tin triển khai dần dần các tính năng ứng dụng mới, thử nghiệm các thiết kế giao diện mới.
Bạn có thể tìm hiểu chi tiết nó trong docs của Laravel 10.
9. Một số update nhỏ khác
- Cung cấp Helper String::password() giúp tạo mật khẩu ngẫu nhiên, an toàn có độ dài nhất định. Mật khẩu theo mặc định sẽ gồm 32 ký tự với sự kết hợp của các chữ cái, số, ký hiệu và khoảng trắng. Chúng ta có thể custom lại với một số options:
// default
$password = Str::password(); // optional
$password = Str::password(12);
- Thuật toán mã hóa nhanh hơn: xxHash là một thuật toán Hash cực kỳ nhanh. Nó có tính ngẫu nhiên và phân tán đầu ra tuyệt vời, cũng như tính duy nhất để giảm va chạm. Vì PHP 8.1 cung cấp hỗ trợ cho xxh128 và vì Laravel 10 chạy trên PHP 8.1 nên việc có một thuật toán băm đáng tin cậy như vậy trong Laravel 10 là lý tưởng.
- Cải thiện hiệu năng của Eager Loading.
- PHPUnit 10 Support
Một số thứ bị loại bỏ
- Loại bỏ phương thức handleDeprecation
- Loại bỏ phương thức assertTimesSent
- Loại bỏ thuộc tính ScheduleListCommand's $defaultName
- Loại bỏ phương thức Route::home
- Loại bỏ phương thức dispatchNow
- Loại bỏ phương thức getBaseQuery, có phương thức toBase tương tự
- Class MaintenanceModeException
- Trait MocksApplicationServices
- Loại bỏ phương thức mail fake’s Mail::failures
- Thuộc tính $dates(dùng $casts)
- Loại bỏ phương thức assertTimesSent()
Tổng kết
Vừa rồi, chúng ta đã tìm hiể về một số thay đổi và cập nhật trong phiên bản Laravel 10.
Ngoài những thay đổi ở trên, vẫn còn một số thay đổi nhỏ nữa mà mình chưa đề cập tới hoặc chưa tìm hiểu ra. Các bạn hãy bổ sung cho mình ở phần comment nhé.
Cảm ơn mọi người đã đọc bài viết của mình. Hẹn gặp lại mọi người ! 🤗🤗🤗
Tại liệu tham khảo: https://laravel.com/