[!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.
Likelihood Of Impact: High
Laravel hiện yêu cầu PHP 8.1.0 trở lên.
Laravel hiện yêu cầu Composer 2.2.0 trở lên.
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.0laravel/sanctum to ^3.2doctrine/dbal to ^3.0spatie/laravel-ignition to ^2.0laravel/passport to ^11.0 (Upgrade Guide)laravel/ui to ^4.0Nế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.0phpunit/phpunit to ^10.0Cuố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.
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-stability là stable, 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",
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');
registerPolicies MethodLikelihood 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.
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.
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());
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.
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');
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',
];
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
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.
Bus::dispatchNow MethodLikelihood Of Impact: Low
Các phương thức Bus::dispatchNow và dispatch_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::dispatchSync và dispatch_sync tương ứng.
dispatch() Helper Return ValueLikelihood 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 đó.
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.
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']
Redirect::home MethodLikelihood 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');
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, expectsJobs và expectsNotifications.
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::fake và Notification::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ả.
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();
},
],
}
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!');
}],
]);
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.
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.
entry