Get in touch
or send us a question?
CONTACT

Có gì mới trong Laravel 9.0?

Laravel v9 là phiên bản LTS tiếp theo của Laravel và ra mắt vào tháng 2 năm 2022. Trong bài viết này, mình xin giới thiệu một vài tính năng mới trong Laravel trong Laravel 9.0

PHP Version

Laravel 9 yêu cầu sử dụng phiên bản tối thiểu là PHP 8 và Symfony 6.0

Route:list

Lệnh routes:list đã được đưa vào Laravel từ lâu, nhưng có một số vấn đề đôi khi nảy sinh khi bạn xác định một route lớn và phức tạp, nó có thể trở nên khó kiểm soát. Nhờ có Nuno Maduro nên route:list đã trở nên dễ dàng và đẹp mắt hơn.

artisan test –coverage

Câu lệnh artisan test --coverage sẽ hiển thị phạm vi kiểm tra trực tiếp trên thiết bị đầu cuối. Nó cũng bao gồm một --min tùy chọn mà bạn có thể sử dụng để chỉ ra mức thực thi ngưỡng tối thiểu cho phạm vi kiểm tra.

Anonymous trong Migrations

Trước đây, mỗi khi bạn chạy lệnh 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 khi vô tình bạn đặt trùng tên với tên migration đã tạo trước đó. Ở phiên bản 8.x Laravel đã ra mắt với một tính năng mới được gọi là Anonymous Stub giúp ngăn chặn xung đột tên của class migration. Kể từ bây giờ, khi bạn chạy make:migration thì nó sẽ return về là một class Anonymous thay vì một class có tên.

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('people', function (Blueprint $table) {
            $table->string('first_name')->nullable();
        });
    }
};

Query Builder Interface

Ở phiên bản trước đây, khi chúng ta sử dụng QueryBuilder ở trong các câu lệnh where nên khó khăn khi nó là Query\Builder hay đôi khi là Eloquent\Builder. Bạn có thể tham khảo thêm tại https://github.com/laravel/framework/pull/37956:

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
	});

Ở phiên bản Laravel 9 tính năng này bổ sung 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. Giúp cho IDE hay VS Code đồng nhất.

PHP 8 String Functions

Vì mức tối thiểu là PHP 8, nên một số function trước đây bị bỏ đi nên Tom Schlick đã gửi PR để chuyển sang sử dụng str_contains() và str_starts_with() các str_ends_with() chức năng nội bộ trong lớp \Illuminate\Support\Str.

SwiftMailer to Symfony Mailer

Các bản phát hành trước của Laravel đã sử dụng thư viện Swift Mailer để tạo object mail và gửi email. Tuy nhiên, thư viện đó không còn được duy trì và đã được thay bởi Symfony Mailer. Vui lòng xem lại hướng dẫn nâng cấp để tìm hiểu thêm về cách đảm bảo ứng dụng của bạn tương thích với Symfony Mailer.

Flysystem 3.x

Laravel 9.x 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.

Improved Eloquent Accessors / Mutators

Accessors và Mutators là những phương thức, khi chúng ta đặt nó thì các bạn có thể gọi properties từ một model, khi properties không có trong model thì nó sẽ tìm Accessors bằng phương thức GET, ngược lại với AccessorsMutators là phương thức SET. Laravel 9.x cung cấp một cách mới để xác định các trình truy cập và trình đột biến Eloquent.

public function getNameAttribute($value)
{
    return strtoupper($value);
}
 
public function setNameAttribute($value)
{
    $this->attributes['name'] = $value;
}

Ở trên gồm 2 function là getNameAttribute trả về value in HOA và setNameAttribute trả về attributes name là value Tuy nhiên, trong Laravel 9.x, bạn có thể xác định bằng một phương thức duy nhất và trả về Illuminate\Database\Eloquent\Casts\Attribute:

use Illuminate\Database\Eloquent\Casts\Attribute;
 
public function name(): Attribute
{
    return new Attribute(
        get: fn ($value) => strtoupper($value),
        set: fn ($value) => $value,
    );
}

Ngoài ra, cách tiếp cận mới này để xác định trình truy cập sẽ lưu vào bộ nhớ cache các giá trị đối tượng được trả về bởi thuộc tính, giống như các lớp truyền tùy chỉnh:

use App\Support\Address;
use Illuminate\Database\Eloquent\Casts\Attribute;
 
public function address(): Attribute
{
    return new Attribute(
        get: fn ($value, $attributes) => new Address(
            $attributes['address_line_one'],
            $attributes['address_line_two'],
        ),
        set: fn (Address $value) => [
            'address_line_one' => $value->lineOne,
            'address_line_two' => $value->lineTwo,
        ],
    );
}

Implicit Route Bindings With Enums

PHP 8.1 giới thiệu hỗ trợ cho Enums. Laravel 9.x giới thiệu khả năng gõ-gợi ý một Enum trên định nghĩa tuyến của bạn và Laravel sẽ chỉ gọi tuyến nếu đoạn tuyến đó là một giá trị Enum hợp lệ trong URI. Nếu không, phản hồi HTTP 404 sẽ được trả về tự động. Ví dụ:

enum Category: string
{
    case Fruits = 'fruits';
    case People = 'people';
}

Bạn có thể xác định một tuyến sẽ chỉ được gọi nếu{category} đoạn tuyến là fruits hoặc people. Nếu không, phản hồi HTTP 404 sẽ được trả về:

Route::get('/categories/{category}', function (Category $category) {
    return $category->value;
});

Xem thêm tại: Trang chính thức Laravel Releases