Những thay đổi có tác động lớn

Những thay đổi có tác động trung bình

Những thay đổi có tác động thấp

Nâng cấp đến 10.0 từ 9.x

Estimated Upgrade Time: 30 Minutes

[!NOTE] Chúng tôi sẽ cố gắng ghi lại mọi thay đổi có thể xảy ra. Vì một số thay đổi này nằm trong các phần ẩn của framework, nên chỉ một phần trong những thay đổi này mới có thể thực sự ảnh hưởng đến application của bạn. Bạn muốn tiết kiệm thời gian? Bạn có thể sử dụng Laravel Shift để giúp tự động hóa việc nâng cấp ứng dụng của bạn.

Updating Dependencies

Likelihood Of Impact: High

PHP 8.1.0 Required

Laravel hiện yêu cầu PHP 8.1.0 trở lên.

Composer 2.2.0 Required

Laravel hiện yêu cầu Composer 2.2.0 trở lên.

Composer Dependencies

Bạn nên cập nhật các library sau vào file composer.json của ứng dụng:

  • laravel/framework to ^10.0
  • laravel/sanctum to ^3.2
  • doctrine/dbal to ^3.0
  • spatie/laravel-ignition to ^2.0
  • laravel/passport to ^11.0 (Upgrade Guide)
  • laravel/ui to ^4.0

Nếu bạn đang nâng cấp lên Sanctum 3.x từ phiên bản phát hành 2.x, vui lòng tham khảo hướng dẫn nâng cấp Sanctum.

Ngoài ra, nếu bạn đang muốn sử dụng PHPUnit 10, thì bạn nên xóa thuộc tính processUncoveredFiles ra khỏi phần <coverage> trong file cấu hình phpunit.xml của ứng dụng. Sau đó, hãy cập nhật các library sau trong file composer.json của ứng dụng:

  • nunomaduro/collision to ^7.0
  • phpunit/phpunit to ^10.0

Cuối cùng, hãy kiểm tra tất cả các package của bên thứ ba mà ứng dụng của bạn sử dụng và xác nhận rằng bạn đang sử dụng phiên bản phù hợp để hỗ trợ Laravel 10.

Minimum Stability

Bạn nên cập nhật cài đặt minimum-stability trong file composer.json của ứng dụng thành stable. Hoặc, nếu giá trị mặc định của minimum-stabilitystable, bạn cũng có thể xóa cài đặt này ra khỏi file composer.json của ứng dụng:

"minimum-stability": "stable",

Application

Public Path Binding

Likelihood Of Impact: Low

Nếu ứng dụng của bạn đang tùy chỉnh "public path" bằng cách liên kết path.public vào trong container, thay vào đó bạn nên cập nhật code của bạn gọi phương thức usePublicPath do đối tượng Illuminate\Foundation\Application cung cấp:

app()->usePublicPath(__DIR__.'/public');

Authorization

The registerPolicies Method

Likelihood Of Impact: Low

Phương thức registerPolicies của AuthServiceProvider bây giờ đã được framework gọi mặc định. Vì vậy, bạn có thể xóa code gọi đến phương thức này trong phương thức boot của AuthServiceProvider trong ứng dụng của bạn.

Cache

Redis Cache Tags

Likelihood Of Impact: Medium

Việc sử dụng Cache::tags() chỉ được khuyến cáo cho các ứng dụng sử dụng Memcached. Nếu bạn đang sử dụng Redis làm driver cache cho ứng dụng, bạn nên cân nhắc chuyển sang Memcached hoặc nâng cấp ứng dụng của bạn lên Laravel 12.30.0.

Database

Database Expressions

Likelihood Of Impact: Medium

Database "expressions" (thường được tạo thông qua DB::raw) đã được viết lại trong Laravel 10.x để cung cấp thêm chức năng trong tương lai. Điều quan trọng, giá trị chuỗi raw của expression bây giờ phải được lấy ra thông qua phương thức getValue(Grammar $grammar) của expression. Việc ép kiểu expression thành chuỗi bằng (string) sẽ không còn được hỗ trợ nữa.

Thông thường, điều này không ảnh hưởng đến các ứng dụng của bạn; tuy nhiên, nếu ứng dụng của bạn đang ép kiểu thủ công các database expression liệu thành chuỗi thông qua cách sử dụng (string) hoặc gọi trực tiếp phương thức __toString trong biểu thức, thì bạn nên cập nhật code của bạn gọi đến phương thức getValue để thay thế:

use Illuminate\Support\Facades\DB;

$expression = DB::raw('select 1');

$string = $expression->getValue(DB::connection()->getQueryGrammar());

Query Exception Constructor

Likelihood Of Impact: Very Low

Hàm constructor của Illuminate\Database\QueryException bây giờ sẽ chấp nhận tên kết nối làm tham số đầu tiên. Nếu ứng dụng của bạn đang đưa ra exception này, bạn nên điều chỉnh code cho phù hợp.

ULID Columns

Likelihood Of Impact: Low

Khi các migration gọi phương thức ulid mà không có bất kỳ tham số nào, thì cột sẽ được đặt tên là ulid. Trong các phiên bản Laravel trước, việc gọi phương thức này mà không có bất kỳ tham số nào đã tạo ra một cột được đặt tên sai là uuid:

$table->ulid();

Để chỉ định rõ ràng tên cột khi gọi phương thức ulid, bạn có thể truyền tên cột đó cho phương thức:

$table->ulid('ulid');

Eloquent

Model "Dates" Property

Likelihood Of Impact: Medium

Thuộc tính $dates của model Eloquent đã bị loại bỏ trước đó, đã bị xóa. Ứng dụng của bạn bây giờ sẽ sử dụng thuộc tính $casts:

protected $casts = [
    'deployed_at' => 'datetime',
];

Localization

The Language Directory

Likelihood Of Impact: None

Mặc dù không liên quan đến các ứng dụng hiện có, mặc định, framework Laravel đã không còn chứa thư mục lang . Thay vào đó, khi viết các ứng dụng Laravel mới, bạn có thể tạo ra thư mục đó bằng lệnh Artisan lang:publish:

php artisan lang:publish

Logging

Monolog 3

Likelihood Of Impact: Medium

Library Monolog của Laravel đã được cập nhật lên Monolog 3.x. Nếu bạn đang tương tác trực tiếp với Monolog trong ứng dụng của bạn, bạn nên xem qua hướng dẫn nâng cấp của Monolog.

Nếu bạn đang sử dụng dịch vụ ghi log của bên thứ ba như BugSnag hoặc Rollbar, bạn có thể cần phải nâng cấp các package của bên thứ ba này lên phiên bản hỗ trợ Monolog 3.x và Laravel 10.x.

Queues

The Bus::dispatchNow Method

Likelihood Of Impact: Low

Các phương thức Bus::dispatchNowdispatch_now đã bị loại bỏ trước đó, đã bị xóa. Thay vào đó, ứng dụng của bạn nên sử dụng các phương thức Bus::dispatchSyncdispatch_sync tương ứng.

The dispatch() Helper Return Value

Likelihood Of Impact: Low

Việc gọi dispatch với một class không implement Illuminate\Contracts\Queue trước đây sẽ trả về kết quả của phương thức handle của class đó. Tuy nhiên, bây giờ phương thức này sẽ trả về một instance Illuminate\Foundation\Bus\PendingBatch. Bạn có thể sử dụng dispatch_sync() để thực hiện hành vi trước đó.

Routing

Middleware Aliases

Likelihood Of Impact: Optional

Trong các ứng dụng Laravel mới, thuộc tính $routeMiddleware của class App\Http\Kernel đã được đổi tên thành $middlewareAliases để phản ánh rõ hơn mục đích của nó. Bạn có thể đổi tên thuộc tính này trong các ứng dụng hiện có của bạn; tuy nhiên, việc này không bắt buộc.

Rate Limiter Return Values

Likelihood Of Impact: Low

Khi gọi phương thức RateLimiter::attempt, giá trị được trả về bởi closure cũng sẽ được phương thức trả về giá trị đó. Nếu không có giá trị nào hoặc null được trả về, thì phương thức attempt sẽ trả về true:

$value = RateLimiter::attempt('key', 10, fn () => ['example'], 1);

$value; // ['example']

The Redirect::home Method

Likelihood Of Impact: Very Low

Phương thức Redirect::home đã bị loại bỏ trước đó, đã bị xóa. Thay vào đó, ứng dụng của bạn nên redirect đến một named route:

return Redirect::route('home');

Testing

Service Mocking

Likelihood Of Impact: Medium

Trait MocksApplicationServices đã bị loại bỏ trước đó, đã bị xóa ra khỏi framework. Trait này cung cấp các phương thức kiểm tra như expectsEvents, expectsJobsexpectsNotifications.

Nếu ứng dụng của bạn sử dụng các phương thức này, chúng tôi khuyên bạn nên chuyển sang sử dụng Event::fake, Bus::fakeNotification::fake tương ứng. Bạn có thể tìm hiểu thêm về cách làm giả thông qua fake trong tài liệu tương ứng cho từng loại mà bạn đang cố gắng làm giả.

Validation

Closure Validation Rule Messages

Likelihood Of Impact: Very Low

Khi viết các quy tắc validation tùy chỉnh dựa trên closure, việc gọi hàm $fail nhiều lần sẽ làm thêm các thông báo vào một mảng thay vì ghi đè lên thông báo trước đó. Thông thường, điều này sẽ không ảnh hưởng đến ứng dụng của bạn.

Ngoài ra, hàm callback $fail bây giờ sẽ trả về một đối tượng. Nếu trước đó bạn đã khai báo kiểu trả về của hàm closure validation, điều này có thể yêu cầu bạn cập nhật lại khai báo kiểu:

public function rules()
{
    'name' => [
        function ($attribute, $value, $fail) {
            $fail('validation.translation.key')->translate();
        },
    ],
}

Validation Messages and Closure Rules

Likelihood Of Impact: Very Low

Trước đây, bạn có thể gán thông báo lỗi cho một khóa khác bằng cách cung cấp một mảng cho hàm callback $fail được đưa vào trong Closure trong quy tắc validation. Tuy nhiên, bây giờ bạn nên cung cấp khóa làm tham số đầu tiên và thông báo lỗi làm tham số thứ hai:

Validator::make([
    'foo' => 'string',
    'bar' => [function ($attribute, $value, $fail) {
        $fail('foo', 'Something went wrong!');
    }],
]);

Form Request After Method

Likelihood Of Impact: Very Low

Trong các form request, phương thức after hiện đã được Laravel sử dụng. Nếu form request của bạn định nghĩa thêm phương thức after, phương thức này nên được đổi tên hoặc sửa để sử dụng tính năng "after validation" mới trong form request Laravel.

Miscellaneous

Chúng tôi cũng khuyến cáo bạn nên xem các thay đổi trong laravel/laravel GitHub repository. Mặc dù nhiều thay đổi trong số này là không bắt buộc, nhưng có thể bạn muốn giữ các file đó được đồng bộ với ứng dụng của bạn. Một số thay đổi sẽ được đề cập trong hướng dẫn nâng cấp này, nhưng đối với những thay đổi khác, chẳng hạn như thay đổi file cấu hình hoặc comment đều sẽ không được đề cập đến.

Bạn có thể dễ dàng xem các thay đổi đó bằng công cụ so sánh của GitHub và chọn bản cập nhật nào quan trọng với bạn. Tuy nhiên, nhiều thay đổi được hiển thị bởi công cụ so sánh GitHub là do chúng tôi áp dụng các kiểu dữ liệu PHP native. Những thay đổi này tương thích với các phiên bản trước đó và việc áp dụng chúng trong quá trình migration sang Laravel 10 là không bắt buộc.

Release Notes Contribution Guide
© 2023 by Logo page doc-vn