Laravel 11 đã ra mắt! Dưới đây là tất cả những thay đổi lớn và tính năng mới.

Cập nhật vào

Mục luc:

Laravel 11 đã ra mắt! Dưới đây là tất cả những thay đổi lớn và tính năng mới.

Laravel 11 được phát hành khi nào

Laravel 11 đã được phát hành vào ngày 12 tháng 3 năm 2024.

Việc áp dụng một phiên bản chính mới không bao giờ được vội vàng.

Laravel phiên bản trước đó có LTS (Long-Term Support) là phiên bản 6, nhưng mỗi phiên bản chính đều có hai năm cập nhật, đủ thời gian để bạn kiểm tra và nâng cấp mã nguồn của mình.

Theo Chính sách Hỗ trợ, Laravel 10 sẽ nhận được các bản sửa lỗi cho đến ngày 6 tháng 8 năm 2024 và các bản sửa lỗi bảo mật cho đến ngày 4 tháng 2 năm 2025.

Phiên bản PHP Phát hành Sửa lỗi đến Bảo mật đến
10 8.1 14 tháng 2 năm 2023 6 tháng 8 năm 2024 4 tháng 2 năm 2025
11 8.2 12 tháng 3 năm 2024 3 tháng 9 năm 2025 12 tháng 3 năm 2026

Nâng cấp một dự án lên Laravel 11 hoặc tạo một dự án mới

Để nâng cấp một dự án lên Laravel 11, hãy làm theo hướng dẫn nâng cấp đơn giản của mình và chứa đầy những mẹo hữu ích.

Và để tạo một dự án Laravel 11 mới, hãy lấy bộ cài đặt chính thức và chạy lệnh sau:

1laravel new hello-world

Hoặc, nếu bạn muốn sử dụng Composer:

1composer create-project laravel/laravel hello-world

Laravel 11 có những tính năng và thay đổi gì mới?

Một cấu trúc ứng dụng nhẹ nhàng hơn

Với sự giới thiệu của Laravel 11, đã đến lúc làm sạch và xác định lại cách cấu trúc một ứng dụng Laravel. Mục tiêu? Đưa ra một điểm khởi đầu nhỏ gọn và hiệu quả hơn cho dự án của bạn. Và thực sự Laravel team đã làm được điều đó.

Tệp bootstrap/app.php hoàn toàn mới

Trái tim của cuộc đổi mới này chính là tệp bootstrap/app.php, được hồi sinh để hoạt động như trạm điều khiển trung tâm của bạn. Ở đây, bạn có thể điều chỉnh định tuyến ứng dụng, middleware, service providers, xử lý ngoại lệ và nhiều thứ khác - tất cả từ một nơi duy nhất. Hãy tưởng tượng đó như là một con tàu vũ trụ của thuyền trưởng.

Giản lược service providers

Bạn đã quen với việc xử lý nhiều service providers? Laravel 11 nói “Không nữa!” Bây giờ, chỉ còn một AppServiceProvider duy nhất. Thay đổi này tập trung các chức năng của các service providers cũ vào bootstrap/app.php hoặc AppServiceProvider, làm cho mã nguồn của bạn trở nên ngăn nắp hơn.

Tệp định tuyến API và broadcast tùy chọn

Không phải ứng dụng nào cũng cần tính năng API và broadcast ngay từ đầu. Laravel 11 nhận ra điều này bằng cách không bao gồm các tệp định tuyến api.phpchannels.php theo mặc định. Cần chúng? Chỉ cần một lệnh Artisan đơn giản là có thể. Tính linh hoạt của Laravel thể hiện ở đây, cho phép bạn thêm tính năng chỉ khi bạn cần.

1php artisan install:api
2php artisan install:broadcasting

Các lớp middleware mặc định đã biến mất

Những ngày của một thư mục middleware lộn xộn đã qua. Laravel 11 đã di chuyển các middleware này vào bản thân framework, cho phép bạn tận hưởng một cấu trúc ứng dụng sạch sẽ mà vẫn có khả năng tùy chỉnh hành vi middleware từ bootstrap/app.php. Tìm hiểu thêm: “Làm thế nào để tùy chỉnh middleware mặc định trong Laravel 11”

1->withMiddleware(function (Middleware $middleware) {
2 $middleware->redirectGuestsTo('/admin/login');
3})

Xử lý ngoại lệ cũng đã được di chuyển vào bootstrap/app.php

Trong tinh thần hợp nhất, việc xử lý ngoại lệ cũng đã được di chuyển vào bootstrap/app.php. Điều này giữ cho cấu trúc ứng dụng của bạn nhỏ gọn và đồng nghĩa với việc bạn không phải tìm kiếm qua nhiều tệp tin để quản lý các ngoại lệ.

Dưới đây là một đoạn mã từ ghi chú phát hành của Laravel 11 (bootstrap/app.php):

1->withExceptions(function (Exceptions $exceptions) {
2 $exceptions->dontReport(MissedFlightException::class);
3 
4 $exceptions->reportable(function (InvalidOrderException $e) {
5 // ...
6 });
7})

Lập lịch trình công việc trực tiếp trong routes/console.php

Lập lịch công việc bây giờ đơn giản như thêm một vài dòng vào tệp routes/console.php của bạn, nhờ vào facade Schedule mới. Không còn cần kernel console nữa.

Trong routes/console.php:

1use Illuminate\Support\Facades\Schedule;
2 
3Schedule::command('some-service:sync')->daily();

Một lớp controller cơ bản tối giản

Lớp controller cơ bản trong Laravel 11 đã tinh giảm đáng kể. Các traits AuthorizesRequestsValidatesRequests vẫn còn tồn tại, nhưng bạn cũng phải thao tác để sử dụng chúng.

Ví dụ, nếu bạn đang sử dụng chính sách và muốn kiểm tra quyền, bạn phải bao gồm trait AuthorizesRequests trong lớp controller cơ bản của bạn (app/Http/Controllers/Controller.php):

1namespace App\Http\Controllers;
2 
3use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
4 
5abstract class Controller
6{
7 use AuthorizesRequests;
8}

Route mới giúp kiểm tra status của ứng dụng (health-check)

Laravel 11 giới thiệu một route mới giúp kiểm tra status của ứng dụng (health-check) cho phép bạn thực hiện các kiểm tra khác nhau cho các phần khác nhau của ứng dụng và đảm bảo mọi thứ đang hoạt động một cách suôn sẻ.

Route này có thể được xác định trong bootstrap/app.php như sau:

1->withRouting(
2 web: __DIR__.'/../routes/web.php',
3 commands: __DIR__.'/../routes/console.php',
4 health: '/up',
5)

Khi route được truy cập, một sự kiện Illuminate\Foundation\Events\DiagnosingHealth được phát đi.

Giới hạn truy cập theo giây

Việc giới hạn truy cập trong Laravel rất dễ thiết lập. Với Laravel 11, bạn có thể giới hạn truy cập theo giây.

Nhưng tại sao điều này hữu ích? Hãy xem ví dụ sau:

1RateLimiter::for('invoices', function (Request $request) {
2 -return Limit::perMinute(120);
3 +return Limit::perSecond(2);
4});
  1. Nếu chúng ta giới hạn số lượng yêu cầu trong một phút, điều đó có nghĩa là người dùng của bạn cũng có thể gửi 120 yêu cầu trong một giây.
  2. Nhưng nếu chúng ta giới hạn số lượng yêu cầu trong một giây, người dùng của bạn sẽ không thể gửi 120 yêu cầu trong một giây, nhưng vẫn bị giới hạn ở 120 yêu cầu trong một phút.

Một thay đổi tuyệt vời đó chứ?

Khám phá phương thức mới Model::casts()

Thường, trong Laravel, bạn khai báo việc chuyển đổi thuộc tính trong một model Eloquent như sau:

1class User extends Model
2{
3 protected $casts = [
4 'email_verified_at' => 'datetime',
5 ];
6}

Với Laravel 11, bạn có thể xác định việc chuyển đổi thông qua một phương thức casts() trong model của bạn, cho phép bạn sử dụng các phương thức tĩnh với tham số. Đây là cách nó hoạt động:

1class User extends Model
2{
3 protected function casts() : array
4 {
5 return [
6 'foo' => AsCollection::using(FooCollection::class),
7 ];
8 }
9}

Hơn nữa, bạn cũng có thể xác định việc chuyển đổi dưới dạng một mảng:

1class User extends Model
2{
3 // Even in the old $casts property!
4 protected $casts = [
5 'foo' => [AsCollection::class, FooCollection::class],
6 ];
7 
8 protected function casts() : array
9 {
10 return [
11 'foo' => [AsCollection::class, FooCollection::class],
12 ];
13 }
14}

Lưu ý rằng phương thức casts() được ưu tiên hơn thuộc tính $casts.

Tất cả các thay đổi này không gây ảnh hưởng đến mã hiện tại của bạn nếu bạn cập nhật lên Laravel 11.

Xem pull request trên GitHub: PR

Có một trait tiện lợi mới có tên “Dumpable”

Pull request này giới thiệu một trait mới có tên Dumpable trong Laravel 11, nhằm thay thế các phương thức dd và dump hiện tại trong hầu hết các lớp của framework.

Trait này cho phép người dùng Laravel và tác giả gói mở rộng dễ dàng bao gồm các phương thức gỡ lỗi trong các lớp của họ bằng cách sử dụng trait này.

Dưới đây là một ví dụ mã để minh họa cách sử dụng:

1<?php
2 
3namespace App\ValueObjects;
4 
5use Illuminate\Support\Traits\Dumpable;
6use Illuminate\Support\Traits\Conditionable;
7 
8class Address
9{
10 use Conditionable, Dumpable;
11 
12 // ...
13}
14 
15$address = new Address;
16 
17// Before:
18$address->foo()->bar();
19 
20// After:
21$address->foo()->dd()->bar();

Xem pull request trên GitHub: PR

Ngừng hỗ trợ cho PHP 8.1

PHP 8.2 đã được khẳng định và PHP 8.3 hiện là phiên bản PHP mới nhất. Laravel có thể tiến lên phía trước và bỏ bỏ hỗ trợ cho 8.1.

Nhưng hãy nhớ: Ứng dụng Laravel của bạn không cần phải được cập nhật lên phiên bản mới nhất ngay khi nó được phát hành.

Đặc biệt là nếu bạn có các dự án có khách hàng trả phí hoặc nhân viên phụ thuộc vào chúng để làm việc.

Những dự án đó cần di chuyển từ từ nhưng chắc chắn bằng cách thực hiện kiểm tra kỹ lưỡng. Đừng vội vàng.

Xem pull request trên GitHub: PR Cảm ơn các bạn đã dành thời gian đọc bài!

Recommended