Quay lại

Cùng Khám Phá Những Tính Năng Và Thay Đổi Trong Laravel 11 Chuyên mục PHP và Laravel    2024-05-25    30 Lượt xem    23 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Cùng Khám Phá Những Tính Năng Và Thay Đổi Trong Laravel 11

Như các bạn biết thì Laravel 11 là phiên bản mới nhất của framework PHP Laravel va nó được released vào Ngày 12 tháng 3 năm 2024, Với những cải tiến vượt bậc và các tính năng mới đầy hứa hẹn, Laravel 11 hứa hẹn sẽ tiếp tục giữ vững vị thế của mình trong cộng đồng lập trình viên web.  Hãy cùng mình khám phá những điểm nổi bật và các tính năng mới mà Laravel 11 mang lại, để sẵn sàng cho một kỷ nguyên phát triển ứng dụng web mới đầy tiềm năng.

Phiên bản PHP Ngày phát hành Sửa lỗi đến Sửa lỗi bảo mật đến
8 7.3 - 8.1 8 tháng 9, 2020 26 tháng 7, 2022 24 tháng 1, 2023
9 8.0 - 8.2 8 tháng 2, 2022 8 tháng 8, 2023 6 tháng 2, 2024
10 8.1 - 8.2 14 tháng 2, 2023 6 tháng 8, 2024 4 tháng 2, 2025
11 8.2 12 tháng 3 năm 2024 5 tháng 8, 2025 3 tháng 2, 2026

Với sự ra mắt của Laravel 11, đây sẽ là tin vui cho các anh em, nhưng hãy nhớ rằng không phải tất cả các dự án đều cần được cập nhật ngay lập tức. Mỗi version chính của Laravel đều nhận được cập nhật trong hai năm, giúp các developer có thời gian chuẩn bị và thực hiện các cập nhật cần thiết.

Laravel 10 sẽ tiếp tục 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, vì vậy anh em có thể tận dụng sự ổn định và hỗ trợ của phiên bản này trong khi chờ đợi các khả năng phát triển web của Laravel 11.

Dưới đây là một số tính năng mới trong phiên bản Laravel 11 mà mình cập nhập trên doc của laravel 11.

Laravel Installation

Để cài đặt Laravel 11, bây giờ bạn có thể sử dụng lệnh sau:

composer global require laravel/installer​

Sau đó chạy:

laravel new your-project-name

Thay Đổi Cấu Trúc Thư Mục

Thay đổi lớn nhất cho Laravel 11 là khung ứng dụng được tối giản hơn.

Khi bạn cài đặt một dự án Laravel mới, cấu trúc thư mục sẽ trông như thế này:

app/
├── Http/
│   └── Controllers/
│       └── Controller.php
├── Models/
│   └── User.php
└── Providers/
    └── AppServiceProvider.php
bootstrap/
├── app.php
└── providers.php
config/
├── app.php
└── auth.php
└── ...
routes/
├── console.php
└── web.php

LƯU Ý: Những thay đổi cấu trúc này là TÙY CHỌN. Chúng sẽ chỉ là mặc định cho các dự án MỚI. Các ứng dụng Laravel cũ vẫn có thể giữ cấu trúc cũ.

Các thư mục bị xóa: app/Console, app/Exceptions, app/Http/Middleware.

Routes, Middleware, và Exceptions hiện được đăng ký trong tệp bootstrap/app.php.

Nội dung bootstrap/app.php:

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) { 
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create(); ​

Ngoài ra, thư mục routes đã được clean hơn. Các tệp routes/channel.php, và routes/api.php đã bị xóa.

Bạn có thể kiểm tra pull request ban đầu [11.x] để xem chi tiết hơn về những thay đổi đã được thực hiện.

Per-second rate limiting

Laravel 11 giới thiệu một tính năng mới về giới hạn tần suất mỗi giây cho phép bạn hạn chế số lượng request mà một người dùng có thể thực hiện đối với ứng dụng của bạn mỗi giây. Tính năng này có thể hữu ích để ngăn chặn lạm dụng tài nguyên của ứng dụng của bạn và đảm bảo rằng ứng dụng của bạn vẫn phản hồi đối với người dùng hợp lệ.

RateLimiter::for('emails', function (Request $request) {
    return Limit::perSecond(1);
});

Laravel Reverb

Laravel 11 đi kèm với một máy chủ WebSocket do chính Laravel phát triển, được gọi là Laravel Reverb. Máy chủ này cung cấp một cách đơn giản và hiệu quả để xử lý kết nối WebSocket trong ứng dụng Laravel của bạn. Để biết thêm thông tin về Laravel Reverb.

php artisan reverb:start

Removed Config Files

Khi chúng ta nhìn vào thư mục config/ của Laravel 10, bạn sẽ thấy các tệp sau đây không còn xuất hiện trong Laravel 11:

  • config/broadcasting.php
  • config/cors.php
  • config/hashing.php
  • config/sanctum.php
  • config/view.php

Nhưng bạn có thể publish chúng thủ công bằng lệnh sau:

php artisan config:publish​

Hoặc:

php artisan config:publish --all​

Ngoài ra, một số giá trị cấu hình bên trong các tệp hiện có đã bị loại bỏ để ưu tiên cho các tự động hóa bên trong chính framework.

Bây giờ, nói về cấu hình SanctumBroadcasting.

API Sanctum Và Broadcasting

Laravel 11 không có tệp routes/api.php, và Sanctum không được cài đặt mặc định. Bạn có thể cài đặt cấu trúc API bằng lệnh:

php artisan install:api

Khi bạn chạy lệnh artisan này, tệp routes/api.php sẽ được tạo và đăng ký trong bootstrap/app.php, và Laravel Sanctum sẽ được cài đặt. Bạn chỉ cần thêm trait Laravel\Sanctum\HasApiTokens vào Model User.

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        api: __DIR__.'/../routes/api.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

Tương tự như các thay đổi về API, broadcasting cũng trở thành có thể cài đặt: để chuẩn bị ứng dụng, bạn có thể sử dụng lệnh:

php artisan install:broadcast

New Defaults Pest And SQLite

Với Laravel 11, có một số cài đặt mặc định mới.

Default testing framework: Pest. Bạn nào chưa biết về Pest thì trước đó mình cũng có một bài về thằng này và cách sử dụng trong laravel rồi. Cách sử dụng Pest để viết unit test trong Laravel.

Cơ sở dữ liệu mặc định: SQLite Cơ sở dữ liệu mặc định cho Laravel đã được thay đổi thành SQLite.

DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=

Nếu bạn muốn thay đổi trình điều khiển cơ sở dữ liệu mặc định thành MySQL, thì các bạn làm như sau:

Trong file .ENV thay đổi thành:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=s2sontech
DB_USERNAME=s2sontech
DB_PASSWORD=

Nếu như bạn gặp lỗi :

 SQLSTATE[HY000]: General error: 1273 Unknown collation: 'utf8mb4_0900_ai_ci'

Hãy chạy lệnh sau: 

php artisan config:publish

Thay đổi  'collation' => 'utf8mb4_0900_ai_ci', THÀNH 'collation' => 'utf8mb4_unicode_ci'.

Artisan Commands Mới

Laravel 11 đi kèm với các lệnh artisan mới bây giờ, bạn có thể tạo enums, interfacesclasses, trait.

php artisan make:class
php artisan make:enum
php artisan make:interface
php artisan make:trait

Health Check

Laravel 11 bao gồm một route health check mới có thể được sử dụng để kiểm tra health của ứng dụng của bạn (domain/up). Route này có thể được sử dụng để kiểm tra xem ứng dụng của bạn có hoạt động và chạy không, và có thể được sử dụng cho mục đích giám sát.

bootstrap/app.php:
return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        channels: __DIR__.'/../routes/channels.php',
        health: '/up', 
    )
    ->withMiddleware(function (Middleware $middleware) {
        //
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

Laravel định nghĩa route health khi thiết lập và kích hoạt DiagnosingHealth Event.

src / Illuminate / Foundation / Configuration / ApplicationBuilder.php:

use Illuminate\Foundation\Events\DiagnosingHealth;
use Illuminate\Support\Facades\View;
 
class ApplicationBuilder
{
    // ...
 
    protected function buildRoutingCallback(?string $web,
        ?string $api,
        ?string $pages,
        ?string $health,
        string $apiPrefix,
        ?callable $then)
    {
        return function () use ($web, $api, $pages, $health, $apiPrefix, $then) {
            if (is_string($api) && realpath($api) !== false) {
                Route::middleware('api')->prefix($apiPrefix)->group($api);
            }
 
            if (is_string($health)) { 
                Route::middleware('web')->get($health, function () {
                    Event::dispatch(new DiagnosingHealth);
 
                    return View::file(__DIR__.'/../resources/health-up.blade.php');
                });
            } 
 
            if (is_string($web) && realpath($web) !== false) {
                Route::middleware('web')->group($web);
            }
 
            if (is_string($pages) &&
                realpath($pages) !== false &&
                class_exists(Folio::class)) {
                Folio::route($pages, middleware: $this->pageMiddleware);
            }
 
            if (is_callable($then)) {
                $then($this->app);
            }
        };
    }
 
    // ...
}

Sử dụng domain/up để kiểm tra response time.

Dumpable Trait

Laravel 11 giới thiệu một trait mới là Dumpable. Nó được thiết kế để thay thế các phương thức dd()dump() hiện tại trong hầu hết các Class của framework.

Dưới đây là một ví dụ về cách sử dụng:

use Illuminate\Support\Traits\Conditionable;
use Illuminate\Support\Traits\Dumpable;
 
class Address
{
    use Conditionable, Dumpable;
 
    // ...
}
$address = new Address;
 
#$address->setThis()->setThat(); 
$address->setThis()->dd()->setThat(); 

Xem chi tiết về yêu cầu pull trên GitHub: [11.x] Adds Dumpable concern.

Limit Eager Load

Trong Laravel 11, sẽ cho phép giới hạn số lượng bản ghi được eager load một cách tự nhiên, mà không cần sử dụng các packages bên ngoài.

class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

class Post extends Model
{
    // ...
}

$users = User::with(['posts' => function ($query) {
    $query->latest()->limit(10); 
}])->get();

Casts Method

Từ Laravel 11, casts sẽ được cung cấp trong phương thức protected casts() thay vì thuộc tính protected $casts.

class User extends Authenticatable
{
    // ...
 
    protected function casts(): array
    {
        return [
            'email_verified_at' => 'datetime',
            'password' => 'hashed',
        ];
    }
}

Ngoài ra, bây giờ cũng có thể cung cấp một mảng.

protected function casts(): array
{
    return [
        'bookOptions' => [AsCollection::class, OptionCollection::class],
    ];
}
 

Đây là một thay đổi không gây ra sự cố. Bạn chỉ cần biết rằng phương thức casts() được ưu tiên hơn thuộc tính $casts.

Xem pull request trên GitHub: [11.x] Thêm phương thức Model::casts() và các phương thức tĩnh được đặt tên cho các caster tích hợp.

once() Method

Có một hàm memoization mới được gọi là once(). Hàm này đảm bảo rằng một hàm có thể gọi chỉ một lần, trả về kết quả giống nhau trong các lần gọi sau này.

function random(): int
{
    return once(function () {
        return random_int(1, 1000);
    });
}
 
random(); // 123
random(); // 123 (cached result)
random(); // 123 (cached result)

Xem yêu cầu kéo trên GitHub: [11.x] Thêm hàm memoization once.

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday