Có gì mới ở Laravel 9.0?

Có gì mới ở Laravel 9.0?

Laravel v9 sẽ là phiên bản LTS tiếp theo của Laravel và nó sẽ ra mắt vào khoảng tháng 2 năm 2022. Trong bài đăng này, chúng tôi muốn phác thảo tất cả các tính năng và thay đổi mới được công bố cho đến nay.

PHP 8 phiên bản tối thiểu trong Laravel 9

Vì Laravel 9 sẽ yêu cầu Symfony 6.0 và nó có yêu cầu tối thiểu là PHP 8, có nghĩa là Laravel 9 sẽ có cùng một hạn chế này.

Thiết kế mới cho route:list

Lệnh routes:list đã được đưa vào Laravel từ lâu, nhưng có một số vấn đề đôi khi nảy sinh khi bạn xác định một route lớn và phức tạp, nó có thể trở nên khó kiểm soát khi cố gắng xem trong bảng điều khiển. Nhờ có một yêu cầu kéo từ Nuno Maduro nên route:list đã trở nên dễ dàng hơn.

Laravel 9.0

artisan test --coverage

Một artisan test --coverage tùy chọn mới sẽ hiển thị phạm vi kiểm tra trực tiếp trên thiết bị đầu cuối. Nó cũng bao gồm một --mintùy chọn mà bạn có thể sử dụng để chỉ ra mức thực thi ngưỡng tối thiểu cho phạm vi kiểm tra.

Laravel 9.0

Anonymous trong Migrations

Đầu năm nay, Laravel 8.37 ra mắt với một tính năng mới được gọi là Stub ẩn danh giúp ngăn chặn xung đột tên lớp di chuyển.

  use Illuminate\Database\Migrations\Migration;
  use Illuminate\Database\Schema\Blueprint;
  use Illuminate\Support\Facades\Schema;
   
  return new class extends Migration {
   
      /**
       * Run the migrations.
       *
       * @return void
       */
      public function up()
      {
          Schema::table('people', function (Blueprint $table) {
              $table->string('first_name')->nullable();
          });
      }
  };
  

Khi Laravel 9 khởi chạy, đây sẽ là mặc định khi bạn chạy php artisan make:migration

Query Builder Interface

Đối với các nhà phát triển dựa vào các gợi ý kiểu để phân tích tĩnh, tái cấu trúc hoặc hoàn thành mã trong IDE, việc thiếu giao diện được chia sẻ hoặc kế thừa giữa Query\BuilderEloquent\Buildercó Eloquent\Relation thể khá phức tạp:

  return Model::query()
      ->whereNotExists(function($query) {
          // $query is a Query\Builder
      })
      ->whereHas('relation', function($query) {
          // $query is an Eloquent\Builder
      })
      ->with('relation', function($query) {
          // $query is an Eloquent\Relation
      });
  

Tính năng này bổ sung một Illuminate\Contracts\Database\QueryBuilder giao diện mới và một Illuminate\Database\Eloquent\Concerns\DecoratesQueryBuilder đặc điểm thực hiện giao diện thay cho __call triển khai hiện có.

Hàm chuỗi trong PHP 8

Vì PHP 8 sẽ là mức tối thiểu, Tom Schlick đã gửi PR để chuyển sang sử dụng str_contains()và str_starts_with()các str_ends_with()chức năng nội bộ trong \Illuminate\Support\Strlớp.

Từ SwiftMailer đến Symfony Mailer

Các bản phát hành trước của Laravel đã sử dụng thư viện Swift Mailer để gửi email đi. Tuy nhiên, thư viện đó không còn được duy trì và đã được thành công bởi Symfony Mailer.

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

Laravel 9.x nâng cấp sự phụ thuộc vào hệ thống Flysystem ngược dòng của chúng tôi lên Flysystem 3.x. Flysystem cung cấp năng lượng cho tất cả các tương tác hệ thống tệp được cung cấp bởi Storage mặt tiền.

Improved Eloquent Accessors / Mutators

Laravel 9.x cung cấp một cách mới để xác định các trình truy cập và trình đột biến Eloquent. Trong các bản phát hành trước của Laravel, cách duy nhất để xác định trình truy cập và trình đột biến là bằng cách xác định các phương thức có tiền tố trên mô hình 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ể xác định một trình truy cập và trình đột biến bằng một phương thức duy nhất, không có tiền tố bằng cách gõ gợi ý kiểu trả về 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 để xác định trình truy cập sẽ lưu vào bộ nhớ cache các giá trị đối tượng được trả về bởi thuộc tính, giống như các lớp truyền tùy chỉnh:

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

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

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

Bạn có thể xác định một tuyến sẽ chỉ được gọi nếu {category} đoạn tuyến là fruits hoặc people. Nếu không, phản hồi HTTP 404 sẽ được trả về:

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

Controller Route Groups

Bây giờ bạn có thể sử dụng controller phương pháp để xác định bộ điều khiển chung cho tất cả các tuyến trong nhóm. Sau đó, khi xác định các tuyến, bạn chỉ cần cung cấp phương thức điều khiển 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');
  });
  

Enum Eloquent Attribute Casting

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

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

Khi bạn đã xác định kiểu truyền trên mô hình của mình, thuộc tính được chỉ định sẽ tự động được truyền đến và đi 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();
  }
  

Forced Scoped Bindings

Trong các bản phát hành trước của Laravel, bạn có thể muốn xác định phạm vi mô hình Eloquent thứ hai trong một định nghĩa tuyến sao cho nó phải là con của mô hình Eloquent trước đó. Ví dụ: hãy xem xét định nghĩa tuyến đường này truy xuất một bài đăng trên blog bằng slug cho 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 ràng buộc ngầm có khóa tùy chỉnh làm tham số tuyến lồng nhau, Laravel sẽ tự động phân phạm vi truy vấn để truy xuất mô hình lồng nhau bởi cha của nó bằng cách sử dụng các quy ước để đoán tên mối quan hệ trên cha. Tuy nhiên, hành vi này trước đây chỉ được hỗ trợ bởi Laravel khi một khóa tùy chỉnh được sử dụng cho ràng buộc tuyến 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 các ràng buộc "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 scopeBindings phương thức khi xác định tuyến đường của mình:

  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 toàn bộ nhóm định nghĩa tuyến sử dụng liên kết theo phạm vi:

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

API Laravel Breeze & Next.js

Bộ khởi động Laravel Breeze đã nhận được chế độ giàn giáo "API" và triển khai giao diện người dùng Next.js miễn phí . Dàn giáo bộ khởi động này có thể được sử dụng để khởi động các ứng dụng Laravel của bạn đang đóng vai trò là chương trình phụ trợ, API được xác thực Laravel Sanctum cho giao diện người dùng JavaScript.

Laravel Scout Database Engine

Nếu ứng dụng của bạn tương tác với cơ sở dữ liệu có kích thước 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 công cụ "cơ sở dữ liệu" của Scout thay vì dịch vụ tìm kiếm chuyên dụng như Algolia hoặc MeiliSerach. Công cụ cơ sở dữ liệu sẽ sử dụng các mệnh đề "nơi thích" và chỉ mục văn bản đầy đủ khi lọc kết quả từ cơ sở dữ liệu hiện có của bạn để xác định kết quả tìm kiếm thích hợp cho truy vấn của bạn.

Full Text Indexes / Where Clauses

Khi sử dụng MySQL hoặc PostgreSQL, fullText phương thức hiện có thể được thêm vào định nghĩa cột để tạo chỉ mục văn bản đầy đủ:

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

Ngoài ra, các phương thức whereFullTextorWhereFullText có thể được sử dụng để thêm văn bản đầy đủ mệnh đề "where" vào truy vấn cho các cột có chỉ mục văn bản đầy đủ. Các phương thức này sẽ được Laravel chuyển thành SQL thích hợp cho hệ thống cơ sở dữ liệu bên dưới. Ví dụ: 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();
  

Rendering Inline Blade Templates

Đôi khi bạn có thể cần phải chuyển đổi một chuỗi mẫu Blade thô thành HTML hợp lệ. Bạn có thể thực hiện điều này bằng cách sử dụng phương pháp render được cung cấp bởi Blade. Phương thức render chấp nhận chuỗi mẫu Blade và một mảng dữ liệu tùy chọn để cung cấp cho mẫu:

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

Socket Echo Server

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

Bootstrap 5 Pagination Views

Laravel hiện bao gồm các dạng xem phân trang được xây dựng bằng Bootstrap 5. Để sử dụng các dạng xem này thay vì các dạng xem Tailwind mặc định, bạn có thể gọi phương thức của useBootstrapFive trình phân trang trong phương thức boot của App\Providers\AppServiceProvider lớp của bạn:

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

Improved Ignition Exception Page

Ignition, trang gỡ lỗi ngoại lệ nguồn mở do Spatie tạo, đã được thiết kế lại từ đầu. Ignition mới, cải tiến đi kèm với Laravel 9.x và bao gồm các chủ đề sáng / tối, chức năng "mở trong trình chỉnh sửa" có thể tùy chỉnh và hơn thế nữa.

Improved Ignition Exception Page

New Helpers

Laravel 9.x giới thiệu hai chức năng trợ giúp mới, tiện lợi mà bạn có thể sử dụng trong ứng dụng của riêng mình.

str

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

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

Nếu không có đối số nào được cung cấp cho hàm str, hàm sẽ trả về một thể hiện của Illuminate\Support\Str:

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

to_route

Hàm to_route tạo phản hồi HTTP chuyển hướng cho một tuyến đường được đặt tên nhất định, cung cấp một cách chuyển hướng rõ ràng đến các tuyến đường được đặt tên từ các tuyến đường và bộ điều khiển của bạn:

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

Nếu cần, bạn có thể chuyển mã trạng thái HTTP sẽ được gán cho chuyển hướng và bất kỳ tiêu đề phản hồi bổ sung nào làm đối số thứ ba và thứ tư cho phương thức to_route:

  return to_route('users.show', ['user' => 1], 302, ['X-Framework' => 'Laravel']);
  

Tệp server.php có thể bị xóa

Một tính năng nhỏ nhưng bây giờ bạn có thể xóa server.php tệp khỏi dự án của mình và nó sẽ được đưa vào bên trong khuôn khổ. Tập tin này chỉ được sử dụng cho php artisan serve.

Và nhiều hơn nữa...

Laravel 9 vẫn còn vài tháng nữa và nhiều tính năng và thông báo mới sẽ ra mắt. Chúng tôi sẽ cập nhật bài đăng này khi chúng được công bố. Bạn cũng có thể xem trang phát hành chính thức.

Tác giả: Jos Hoàng Tiên
Hãy mua cho mình một cuốn notebook và một cây bút kể cả khi bạn là dân coder.