- Laravel 9.0 có gì mới
- PHP Version
- Cải tiến Route:list
- Anonymous trong Migrations
- Query Builder Interface
- Symfony Mailer
- PHP 8 String Functions
- Forced Scoping Of Route Bindings
- Full Text Indexes / Where Clauses
- Controller Route Groups
- Rendering Inline Blade Templates
- Flysystem 3.x
- Enum Eloquent Attribute Casting
- Laravel Breeze API & Next.js
- Laravel Scout Database Engine
- Soketi Echo Server
- Bootstrap 5 Pagination Views
- Kết luận
Tiếp tục seri về Laravel framework thì mình nay mình sẽ giới thiệu đến các bạn về những tính năng mới trong Laravel 9.0. Laravel 9.0 được phát hành từ 8/2/2022 ở phiên bản 9.0 này Laravel đã bổ sung thêm những tính năng mới cho framework của mình cũng như là thay đổi chu kỳ phát hành của các phiên bản kế tiếp như Laravel 10.
Ở các phiên bản trước đó Laravel thường được phát hành khoảng 6 tháng một lần nhưng kể từ phiên bản Laravel 9 trở đi thì các phiên bản sẽ được phát hành hàng năm vào khoảng tháng 2. Laravel 10 có gì mới ở bản phát hành mới nhất.
Laravel 9.0 có gì mới
Laravel 9 là phiên bản cải tiến của Laravel 8.x với những hỗ trợ cho các thành phần Symfony 6.0, Symfony Mailer, Flysystem 3.0, cải tiến route:list đầu ra, trình điều khiển cơ sở dữ liệu Laravel Scout, cú pháp Eloquent accessor / mutator, liên kết thông qua Enums và sửa các lỗi cũng như các cải tiến khác.
Xem thêm: Laravel 10 có gì mới
PHP Version
Trong phiên bản Laravel 9 thì nhà cung cấp yêu cầu sử dụng phiên bản tối thiểu là PHP 8 và Symfony 6.0 cho dự án. Với php 8.x mới nhất nó đã thêm được rất nhiều tính năng mới và mạnh mẽ hơn. Hiệu năng và tốc độ đều cải thiện ở phiên bản này. PHP 8 bao gồm các cập nhập về đặt tên tham số, union types, thay đổi về constructor, match expression, Just In Time (JIT),... Đây là điểm cộng nhưng cũng sẽ rất khó khăn cho các dự án dùng phiên bản php và laravel cũ hơn muốn nâng cấp lên laravel 9. Nếu bạn là người mới thì hãy xem thêm Laravel là gì?
Cải tiến Route:list
Nếu bạn là người dùng laravel từ lâu thì không quá xa lạ với lệnh routes:list. Nhưng đôi khi bạn thực hiện một dự án lớn và phức tạp thì route của bạn nó có thể trở nên rất khó kiểm soát và bị hoa mắt khi nhìn vào đống route của laravel. Nhưng giờ đây nhờ có Nuno Maduro mà route:list đã trở nên dễ dàng và đẹp mắt hơn.
Anonymous trong Migrations
Các phiên bản trước đây, mỗi khi bạn chạy lệnh `php artisan make:migration` thì sẽ tạo ra một class có tên dựa theo tên mà bạn đặt, điều này dễ xảy ra xung đột giữa các migration khi vô tình bạn đặt trùng tên với tên migration đã tạo trước đó. Nhưng tại phiên bản Laravel 8.x, Laravel đã ra mắt với một tính năng mới được là Anonymous Stub giúp ngăn chặn xung đột khi đặt tên của class migration. Kể từ phiên bản laravel 9, khi bạn chạy make:migration thì mặc định nó sẽ trả về một class Anonymous thay vì một class có tên như trước đó.
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('blogs', function (Blueprint $table) {
$table->string('name')->nullable();
});
}
};
Query Builder Interface
Ở các phiên bản laravel trước đây khi chúng ta sử dụng tính năng QueryBuilder ở trong các câu lệnh where sẽ rất khó khăn giữa việc chọn sử dụng Query\Builder, Eloquent\Builder và Eloquent\Relation để thực hiện truy vấn nếu bạn không có một IDE có chưc năng gợi ý. Nhưng ở phiên bản Laravel 9 tính năng này bổ sung thêm một Illuminate\Contracts\Database\QueryBuilder mới và một Illuminate\Database\Eloquent\Concerns\DecoratesQueryBuilder đặc điểm thực hiện thay cho __call hiện tại.
return Model::query()
->whereNotExists(function($query) {
// $query is a Query\Builder
})
->whereHas('relation', function($query) {
// $query is an Eloquent\Builder
})
->with('relation', function($query) {
// $query is an Eloquent\Relation
});
Symfony Mailer
Các bản Laravel trước, Laravel đã sử dụng thư viện Swift Mailer để tạo object mail và gửi email trong ứng dụng laravel. Tuy nhiên thư viện này không còn được hỗ trợ duy trì ở phiên bản này mà đã được thay thế bởi Symfony Mailer. Symfony Mailer yêu cầu phiên bản PHP tối thiểu là 8.2.0 bạn có thể tham khảo thêm chi tiết hơn tại chính thức của Laravel
PHP 8 String Functions
Ở Laravel 9 phiên bản PHP thấp nhất là PHP 8 vì thế Tom Schlick đã gửi PR để chuyển sang sử dụng các chức năng nội bộ trong class str_contains(), str_starts_with(), str_ends_with() và \Illuminate\Support\Str.
Forced Scoping Of Route Bindings
Tính này mới này khá thú vị và hữu ích. Forced Scoping Of Route Bindings tạm hiểu là ràng buộc định tuyến.
Ví dụ: hãy xem xét định nghĩa tuyến đường này truy xuất một bài đăng trên blog bằng đường dẫn cho một người dùng cụ thể
use App\Models\Post;
use App\Models\User;
Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
});
Với route này thì** $post** và $user sẽ không có sự ràng buộc nào lẫn nhau. Có nghĩa là $post sẽ được lấy từ id ở đường dẫn và gọi query vào Model Post. Nhưng khi sử dụng thêm scopeBindings() như thế này thì $post sẽ được ràng buộc thêm điều kiện user_id bằng với id của $user
use App\Models\Post;
use App\Models\User;
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
})->scopeBindings();
Hoặc, bạn có thể hướng dẫn toàn bộ nhóm định nghĩa tuyến sử dụng liên kết theo phạm vi:
Route::scopeBindings()->group(function () {
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
});
});
Full Text Indexes / Where Clauses
Phương thức fullText hiện có thể được thêm vào định nghĩa các trường trong CSDL để tạo ra chỉ mục văn bản đầy đủ:
$table->longtext('description')->fullText();
Ngoài ra các phương thức như whereFullText và orWhereFullText có thể được sử dụng để thêm một văn bản đầy đủ mệnh đề "where" vào truy vấn cho các field có chỉ mục văn bản đầy đủ. Các phương thức này sẽ được Laravel chuyển thành SQL thích hợp cho hệ thống cơ sở dữ liệu bên dưới. Ví dụ: mệnh đề MATCH AGAINST sẽ được tạo cho các ứng dụng sử dụng MySQL:
$users = DB::table('users')
->whereFullText('description', 'Hozitech')
->get();
Controller Route Groups
Bây giờ bạn có thể sử dụng controller để xác định bộ điều khiển chung cho tất cả các route trong group. Khi xác định các route trong ứng dụng bạn chỉ cần cung cấp phương thức controller:
use App\Http\Controllers\CategoryController;
Route::controller(CategoryController::class)->group(function () {
Route::get('/category/{id}', 'show');
Route::post('/categories', 'store');
});
Rendering Inline Blade Templates
Ở các phiên bản trước đây sẽ rất khó khăn khi bạn cần render một đoạn text ra HTML nhưng giờ đây ở phiên bản 9.x này bạn có thể đơn giản hoá công việc hơn với đoạn code sau:
use Illuminate\Support\Facades\Blade;
return Blade::render('Dịch vụ thiết kế website, {{ $name }}', ['name' => 'Hozitech']);
Flysystem 3.x
Trong phiên bản nâng cấp của Laravel 9 thì nó cũng nâng cấp phụ thuộc vào hệ thống Flysystem để lên Flysystem 3.x. Flysystem cung cấp cho tất cả các giao tiếp hệ thống tệp được cung cấp bởi Storage.
Enum Eloquent Attribute Casting
Eloquent hiện cho phép bạn truyền các thuộc tính của mình sang các enum PHP. Để thực hiện điều này, bạn có thể chỉ định thuộc tính và enum mà bạn muốn truyền trong $casts mảng thuộc tính của mô hình:
use App\Enums\OrderStatus;
/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
'status' => OrderStatus::class,
];
Khi đã xác định kiểu truyền trên mô hình của mình, thuộc tính được chỉ định sẽ tự động được truyền đến và đi từ một enum khi bạn tương tác với thuộc tính:
if ($server->status == OrderStatus::provisioned) {
$server->status = OrderStatus::pending;
$server->save();
}
Laravel Breeze API & Next.js
Laravel Scout Database Engine
Khi hệ thống tương tác với cơ sở dữ liệu có kích thước vừa và nhỏ hoặc có khối lượng công việc nhẹ, giờ đây bạn có thể sử dụng công cụ Database của Scout thay vì dịch vụ tìm kiếm chuyên dụng như Algolia hoặc MeiliSerach. Công cụ database sẽ sử dụng các mệnh đề "nơi thích" và chỉ mục văn bản đầy đủ khi lọc kết quả từ cơ sở dữ liệu hiện có của bạn để xác định kết quả tìm kiếm thích hợp cho truy vấn của bạn.
Soketi Echo Server
Giờ đây Laravel đã hỗ trợ tài liệu về Soketi, một máy chủ Web Socket tương thích với Laravel Echo được viết cho Node.js. Soketi cung cấp một giải pháp thay thế tuyệt vời cho Pusher và Ably.
Bootstrap 5 Pagination Views
Laravel đã hỗ trợ các định dạng paginate khác ngoài boostrap vì thế để sử dụng lại boostrap thay vì các các paginate khác như Tailwind. Bạn có thể sử dụng phương thức của useBootstrapFive trình phân trang trong phương thức boot của lớp App\Providers\AppServiceProvider:
use Illuminate\Pagination\Paginator;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Paginator::useBootstrapFive();
}
Kết luận
Ở bài viết này mình đã giới thiệu cho các bạn một bài viết nữa trong series học Laravel. Ở bài viết này chúng ta đã đi qua tổng quan về các tính năng mới được cập nhật trong phiên bản Laravel 9. Mong rẳng thông qua bài viết này sẽ giúp bạn kịp thời cập nhật và ứng dụng các tính năng hữu ích trên cho dự án của mình.
Tham khảo thêm các bài viết:
https://hozitech.com/laravel-10-co-gi-moi
https://hozitech.com/cau-truc-thu-muc-laravel-laravel
https://hozitech.com/gioi-thieu-ve-laravel-laravel-la-gi
https://hozitech.com/model-trong-laravel
https://hozitech.com/authentication-va-authorization-trong-laravel-la-gi