Cấu trúc phiên bản

Laravel và các package khác của nó tuân theo Phiên bản Semantic. Các phiên bản được phát hành chính thức của framework được phát hành một năm một lần (khoảng tháng 2), trong khi các bản phát hành nhỏ hơn và các bản sửa lỗi có thể được phát hành thường xuyên hơn, có thể là mỗi tuần. Các bản phát hành nhỏ và các bản sửa lỗi sẽ không bao giờ chứa các thay đổi mà có thể dẫn đến hệ thống của bạn bị lỗi.

Khi sủ dụng framework Laravel hoặc các component của nó từ application của bạn hoặc từ package, bạn phải luôn luôn sử dụng một ràng buộc phiên bản, chẳng hạn như là ^9.0, Vì các bản phát hành chính thức của Laravel có thể chứa các thay đổi mà có thể làm hệ thống của bạn bị lỗi. Tuy nhiên, chúng tôi sẽ cố gắng đảm bảo rằng: bạn có thể cập nhật lên bản phát hành chính thức trong một ngày hoặc ít hơn.

Named Arguments

Đặt tên cho tham số không nằm trong nguyên tắc tương thích ngược của Laravel. Chúng tôi có thể đổi tên các tham số bất cứ khi nào để cải thiện codebase của Laravel. Do đó, việc sử dụng các kiểu đặt tên cho tham số khi gọi các phương thức của Laravel nên được thực hiện một cách cẩn trọng và nên hiểu rằng tên tham số có thể thay đổi trong tương lai.

Chính sách hỗ trợ

Đối với tất cả các bản phát hành chính thức, các bản sửa lỗi sẽ đượ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. Đối với tất cả các thư viện, bao gồm cả Lumen, chỉ bản phát hành chính thức mới nhất mới nhận được các bản sửa lỗi. Ngoài ra, hãy xem các phiên bản cơ sở dữ liệu được hỗ trợ bởi Laravel.

Version PHP (*) Release Bug Fixes Until Security Fixes Until
6 (LTS) 7.2 - 8.0 ngày 3 tháng 9 năm 2019 ngày 25 tháng 1 năm 2022 ngày 6 tháng 9 năm 2022
7 7.2 - 8.0 ngày 3 tháng 3 năm 2020 ngày 6 tháng 10 năm 2020 ngày 3 tháng 3 năm 2021
8 7.3 - 8.1 ngày 8 tháng 9 năm 2020 ngày 26 tháng 7 năm 2022 ngày 24 tháng 1 năm 2023
9 8.0 - 8.2 ngày 8 tháng 2 năm 2022 ngày 8 tháng 8 năm 2023 ngày 6 tháng 2 năm 2024
10 8.1 - 8.2 Q1 2023 ngày 6 tháng 8 năm 2024 ngày 4 tháng 2 năm 2025
End of life
Security fixes only

(*) Supported PHP versions

Laravel 9

Như bạn có thể biết, Laravel đã chuyển sang phát hành theo năm từ bản phát hành Laravel 8. Trước đây, các phiên bản chính được phát hành sau mỗi 6 tháng. Sự chuyển đổi này nhằm mục đích giảm bớt gánh nặng bảo trì cho cộng đồng và thách thức nhóm phát triển của chúng tôi cung cấp các tính năng mới tuyệt vời, mạnh mẽ mà không giới thiệu các thay đổi nghiêm trọng. Do đó, chúng tôi đã cung cấp nhiều tính năng mạnh mẽ cho Laravel 8 mà không phá vỡ khả năng tương thích ngược, chẳng hạn như hỗ trợ testing song song, bộ công cụ khởi tạo Breeze được cải tiến, cải thiện HTTP client và thậm chí cả các loại quan hệ Eloquent mới như là "có một trong nhiều".

Do đó, cam kết cung cấp những tính năng mới tuyệt vời trong bản phát hành hiện tại nên có thể sẽ khiến các bản phát hành "chính" trong tương lai chủ yếu được sử dụng cho các công việc "bảo trì" như nâng cấp các library, có thể được thấy trong các release note này.

Laravel 9 vẫn sẽ tiếp tục những cải tiến được thực hiện trong Laravel 8.x bằng cách hỗ trợ các component Symfony 6.0, Symfony Mailer, Flysystem 3.0, cải thiện output route:list, driver cơ sở dữ liệu cho Laravel Scout, cú pháp accessor/mutator Eloquent mới, liên kết route ngầm thông qua Enum và một loạt các bản sửa lỗi và cải tiến khả năng sử dụng khác.

PHP 8.0

Laravel 9.x requires a minimum PHP version of 8.0.

Symfony Mailer

Hỗ trợ Symfony Mailer được đóng góp bởi Dries Vints, James Brooks, và Julius Kiekbusch.

Các phiên bản trước của Laravel sử dụng thư viện Swift Mailer để gửi email. Tuy nhiên, thư viện này không còn được bảo trì nữa và đã được thay đổi bằng Symfony Mailer.

Vui lòng xem 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

Hỗ trợ Flysystem 3.x được đóng góp bởi Taylor Otwell.

Laravel 9.x nâng cấp library Flysystem của chúng tôi lên Flysystem 3.x. Flysystem sẽ hỗ trợ tất cả các tương tác filesystem do facade Storage cung cấp.

Vui lòng xem 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 Flysystem 3.x.

Improved Eloquent Accessors / Mutators

Cải tiến accessors / mutators của Eloquent được đóng góp bởi Taylor Otwell.

Laravel 9.x cung cấp một cách mới để định nghĩa các Eloquent accessors và mutators. Trong các phiên bản Laravel trước, cách duy nhất để định nghĩa các accessors và mutators này là định nghĩa các phương thức có tiền tố trên model của bạn như sau:

public function getNameAttribute($value)
{
    return strtoupper($value);
}

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

Tuy nhiên, trong Laravel 9.x, bạn có thể định nghĩa một accessor và mutator trong một phương thức duy nhất, không có tiền tố bằng cách khai báo kiểu trả về là 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 là để định nghĩa các accessor sẽ lưu cache các giá trị đối tượng được trả về bởi thuộc tính, giống như các class cast kiểu tùy biến:

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

Enum Eloquent Attribute Casting

Warning Enums casting chỉ khả dụng trên PHP 8.1+.

Enum casting được đóng góp bởi Mohamed Said.

Eloquent hiện cho phép bạn cast kiểu các giá trị thuộc tính của bạn sang PHP "backed" Enums. Để thực hiện điều này, bạn có thể chỉ định thuộc tính và enum nào mà bạn muốn cast kiểu trong mảng thuộc tính $casts của model:

use App\Enums\ServerStatus;

/**
 * The attributes that should be cast.
 *
 * @var array
 */
protected $casts = [
    'status' => ServerStatus::class,
];

Sau khi bạn đã định nghĩa kiểu cast trên model của bạn, thuộc tính được chỉ định sẽ tự động được cast kiểu sang hoặc từ một enum khi bạn tương tác với thuộc tính đó:

if ($server->status == ServerStatus::Provisioned) {
    $server->status = ServerStatus::Ready;

    $server->save();
}

Implicit Route Bindings With Enums

Liên kết route ẩn được đóng góp bởi Nuno Maduro.

PHP 8.1 dã giới thiệu hỗ trợ Enum. Laravel 9.x cũng giới thiệu khả năng khai báo kiểu cho Enum trên định nghĩa route của bạn và Laravel sẽ chỉ gọi route đó nếu tham số của route đó là một giá trị Enum hợp lệ trong URI. Nếu không, response HTTP 404 sẽ được tự động trả về. Ví dụ, với Enum sau:

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

Bạn có thể định nghĩa một route chỉ được gọi nếu tham số route {category}fruits hoặc people. Nếu không, response HTTP 404 sẽ được trả về:

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

Forced Scoping Of Route Bindings

Liên kết phạm vi bắt buộc được đóng góp bởi Claudio Dekker.

Trong các phiên bản trước của Laravel, bạn có thể muốn giới hạn phạm vi model Eloquent thứ hai trong định nghĩa route sao cho nó phải là con của model Eloquent trước đó. Ví dụ: hãy xem xét định nghĩa route sau để lấy ra một bài đăng blog bằng slug của 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;
});

Khi sử dụng liên kết ngầm có khóa tùy chỉnh làm tham số route lồng nhau, Laravel sẽ tự động xác định phạm vi truy vấn để lấy ra model lồng nhau của cha mẹ bằng cách sử dụng các quy ước để đoán tên quan hệ trên cha mẹ. Tuy nhiên, hành vi này trước đây chỉ được Laravel hỗ trợ khi sử dụng khóa tùy chỉnh cho liên kết route con.

Tuy nhiên, trong Laravel 9.x, bây giờ bạn có thể hướng dẫn Laravel xác định phạm vi liên kết "con" ngay cả khi khóa tùy chỉnh không được cung cấp. Để làm như vậy, bạn có thể gọi phương thức scopeBindings khi định nghĩa route của bạn:

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 nhóm route sử dụng các liên kết có phạm vi:

Route::scopeBindings()->group(function () {
    Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
        return $post;
    });
});

Controller Route Groups

Group route được đóng góp bởi Luke Downing.

Bây giờ bạn có thể sử dụng phương thức controller để định nghĩa controller chung cho tất cả các route có trong nhóm. Sau đó, khi định nghĩa các route, bạn chỉ cần cung cấp phương thức controller mà chúng gọi:

use App\Http\Controllers\OrderController;

Route::controller(OrderController::class)->group(function () {
    Route::get('/orders/{id}', 'show');
    Route::post('/orders', 'store');
});

Full Text Indexes / Where Clauses

Full text index và mệnh đề "where" được đóng góp bởi Taylor OtwellDries Vints.

Khi sử dụng MySQL hoặc PostgreSQL, phương thức fullText hiện có thể được thêm vào định nghĩa cột để tạo index full text:

$table->text('bio')->fullText();

Ngoài ra, các phương thức whereFullTextorWhereFullText có thể được sử dụng để thêm các mệnh đề "where" full text vào truy vấn cho các cột có index full text. Các phương thức này sẽ được Laravel chuyển thành câu lệnh SQL phù hợp cho hệ thống cơ sở dữ liệu. Ví dụ, một mệnh đề MATCH AGAINST sẽ được tạo cho các ứng dụng sử dụng MySQL:

$users = DB::table('users')
           ->whereFullText('bio', 'web developer')
           ->get();

Laravel Scout Database Engine

Laravel Scout database engine được đóng góp bởi Taylor OtwellDries Vints.

Nếu ứng dụng của bạn tương tác với các cơ sở dữ liệu có quy mô 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 "database" engine của Scout thay vì một dịch vụ tìm kiếm chuyên biệt như Algolia hoặc MeiliSearch. Database engine sẽ sử dụng các mệnh đề "where like" và index full text khi lọc kết quả từ cơ sở dữ liệu của bạn để xác định kết quả tìm kiếm phù hợp cho truy vấn của bạn.

Để tìm hiểu thêm về database engine của Scout, hãy tham khảo tài liệu Scout.

Rendering Inline Blade Templates

Render inline Blade template được đóng góp bởi Jason Beggs. Render inline Blade component được đóng góp bởi Toby Zerner.

Thỉnh thoảng bạn có thể cần chuyển chuỗi raw Blade template string thành một chuỗi HTML hợp lệ. Bạn có thể thực hiện điều này bằng phương thức render được cung cấp bởi facade Blade. Phương thức render sẽ chấp nhận chuỗi Blade template string và một mảng dữ liệu tùy chọn để cung cấp cho template:

use Illuminate\Support\Facades\Blade;

return Blade::render('Hello, {{ $name }}', ['name' => 'Julian Bashir']);

Tương tự như vậy, phương thức renderComponent cũng có thể được sử dụng để hiển thị một class component nhất định bằng cách truyền instance component đó cho phương thức:

use App\View\Components\HelloComponent;

return Blade::renderComponent(new HelloComponent('Julian Bashir'));

Slot Name Shortcut

Các shortcut slot name được đóng góp bởi Caleb Porzio.

Trong các phiên bản trước của Laravel, tên của slot được cung cấp bằng cách sử dụng thuộc tính name trên tag x-slot:

<x-alert>
    <x-slot name="title">
        Server Error
    </x-slot>

    <strong>Whoops!</strong> Something went wrong!
</x-alert>

Tuy nhiên, bắt đầu từ Laravel 9.x, bạn có thể chỉ định tên của slot bằng cú pháp ngắn gọn hơn và tiện lợi hơn:

<x-slot:title>
    Server Error
</x-slot>

Checked / Selected Blade Directives

Các lệnh Blade checked và selected được đóng góp bởi Ash AllenTaylor Otwell.

Để thuận tiện, bây giờ bạn có thể sử dụng lệnh @checked để dễ dàng chỉ ra liệu một checkbox HTML nhất định có được "checked" hay không. Lệnh này sẽ checked nếu điều kiện được cung cấp là true:

<input type="checkbox"
        name="active"
        value="active"
        @checked(old('active', $user->active)) />

Tương tự như vậy, lệnh @selected có thể được sử dụng để chỉ ra liệu một tùy chọn chọn nhất định có nên được "selected" hay không:

<select name="version">
    @foreach ($product->versions as $version)
        <option value="{{ $version }}" @selected(old('version') == $version)>
            {{ $version }}
        </option>
    @endforeach
</select>

Bootstrap 5 Pagination Views

Bootstrap 5 pagination view được đóng góp bởi Jared Lewis.

Laravel hiện có chứa các pagination view được xây dựng bằng Bootstrap 5. Để sử dụng các view này thay vì view Tailwind mặc định, bạn có thể gọi phương thức useBootstrapFive ​​của paginator trong phương thức boot của class App\Providers\AppServiceProvider của bạn:

use Illuminate\Pagination\Paginator;

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    Paginator::useBootstrapFive();
}

Improved Validation Of Nested Array Data

Việc validation các array input lồng nhau được đóng góp bởi Steve Bauman.

Thỉnh thoảng bạn có thể cần truy cập vào giá trị cho một phần tử mảng lồng nhau trong khi gán quy tắc validation cho một thuộc tính. Bây giờ bạn có thể thực hiện việc này bằng phương thức Rule::forEach. Phương thức forEach sẽ chấp nhận một closure sẽ được gọi cho mỗi lần lặp của thuộc tính mảng đang được validation và sẽ nhận vào giá trị của thuộc tính và tên thuộc tính được fully-expanded, rõ ràng. Closure sẽ trả về một mảng các quy tắc để gán cho phần tử mảng:

use App\Rules\HasPermission;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

$validator = Validator::make($request->all(), [
    'companies.*.id' => Rule::forEach(function ($value, $attribute) {
        return [
            Rule::exists(Company::class, 'id'),
            new HasPermission('manage-company', $value),
        ];
    }),
]);

Laravel Breeze API & Next.js

Scaffolding API Laravel Breeze và bộ công cụ khởi tạo Next.js được đóng góp bởi Taylor OtwellMiguel Piedrafita.

Bộ công cụ khởi tạo Laravel Breeze đã nhận thêm chế độ scaffolding "API" và frontend implementation từ Next.js. Chế độ scaffolding của bộ công cụ khởi tạo này có thể được sử dụng để khởi tạo các ứng dụng Laravel của bạn mà đóng vai trò là API xác thực Laravel Sanctum cho frontend JavaScript.

Improved Ignition Exception Page

Ignition được phát triển bởi Spatie.

Ignition, trang gỡ lỗi exception open source do Spatie tạo, đã được thiết kế lại hoàn toàn. Phiên bản cải tiến Ignition mới đã đi kèm với Laravel 9.x và chứa các theme light / dark, chức năng "mở trong editor" có thể tùy chỉnh và nhiều hơn nữa.

Improved route:list CLI Output

Output CLI route:list đã được cải tiến và được đóng góp bởi Nuno Maduro.

Output CLI route:list đã được cải tiến đáng kể cho phiên bản phát hành Laravel 9.x, mang đến trải nghiệm mới tuyệt vời khi khám phá định nghĩa route của bạn.

Test Coverage Using Artisan test Command

Test coverage khi sử dụng lệnh test của Artisan được đóng góp bởi Nuno Maduro.

Lệnh test của Artisan đã nhận được tùy chọn --coverage mới mà bạn có thể sử dụng để khám phá lượng bao phủ code mà các bài kiểm tra của bạn cung cấp cho ứng dụng của bạn:

php artisan test --coverage

Kết quả kiểm tra sẽ được hiển thị trực tiếp trong output CLI.

Ngoài ra, nếu bạn muốn chỉ định ngưỡng tối thiểu mà tỷ lệ bao phủ code của bài test của bạn phải đạt được, bạn có thể sử dụng tùy chọn --min. Bài test sẽ thất bại nếu ngưỡng tối thiểu đã cho không đạt được:

php artisan test --coverage --min=80.3

Soketi Echo Server

Soketi Echo server được phát triển bởi Alex Renoki.

Mặc dù không dành riêng cho Laravel 9.x, Laravel gần đây đã hỗ trợ tài liệu của 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 open source thay thế tuyệt vời cho Pusher và Ably cho những ứng dụng muốn quản lý Web Socket server của riêng họ.

Để biết thêm thông tin về cách sử dụng Soketi, vui lòng tham khảo tài liệu broadcastingtài liệu Soketi.

Improved Collections IDE Support

Cải thiện hỗ trợ IDE cho collection được đóng góp bởi Nuno Maduro.

Laravel 9.x đã thêm các cải tiến về định nghĩa kiểu "chung" vào các component collections, cải thiện IDE và hỗ trợ phân tích tĩnh. Các IDE như PHPStorm hoặc các công cụ phân tích tĩnh như PHPStan giờ đây sẽ hiểu rõ hơn về các collection Laravel chính xác hớn.

New Helpers

Laravel 9.x đã giới thiệu hai helper mới, tiện lợi mà bạn có thể sử dụng trong ứng dụng của bạn.

str

Hàm str trả về một instance Illuminate\Support\Stringable mới cho chuỗi đã cho. Hàm này tương đương với phương thức Str::of:

$string = str('Taylor')->append(' Otwell');

// 'Taylor Otwell'

Nếu không cung cấp tham số cho hàm str, hàm sẽ trả về một instance của Illuminate\Support\Str:

$snake = str()->snake('LaravelFramework');

// 'laravel_framework'

to_route

Hàm to_route sẽ tạo ra response HTTP chuyển hướng cho một route đã được đặt tên nhất định, cung cấp một cách dễ hiểu để chuyển hướng đến các route đã được đặt tên từ các route và controller của bạn:

return to_route('users.show', ['user' => 1]);

Nếu cần, bạn có thể truyền HTTP status code cần gán cho lệnh chuyển hướng và bất kỳ response header nào làm tham số thứ ba và thứ tư cho phương thức to_route:

return to_route('users.show', ['user' => 1], 302, ['X-Framework' => 'Laravel']);
Upgrade Guide
© 2023 by Logo page doc-vn