Laravel 8 releases - Part 3

LAMP Sep 24, 2021

Tiếp theo series Laravel 8 releases - Part 1, Laravel 8 releases - Part 2,

Chúng mình cùng tiếp tục tìm hiểu xem Laravel 8 có những điểm gì khác với các bản trước nhé 💑♥️

🌼 Dynamic Blade Components

Đôi khi bạn muốn render một component nhưng không biết trước tên component cho đến khi chạy. Trong trường hợp này, bạn có thể sử dụng component dynamic-component được xây dựng sẵn trong Laravel để render component dựa trên giá trị khi chạy hoặc biến:

<x-dynamic-component:component="$messageComponent" class="text-red-900" />

🌸 Event Listener Improvements

Từ bây giờ, Event Listener dựa trên Closure có thể được register bằng cách truyền Closure vào phương thức Event::listen. Laravel sẽ kiểm tra Closure để xác định loại event được xử lý.

use App\Events\MessageProcessed;
use Illuminate\Support\Facades\Event;

Event::listen(function (MessageProcessed $event) {
    //
});

Ngoài ra, Event Listener dựa trên Closure có thể được đánh dấu là queueable bằng cách sử dụng hàm Illuminate\Events\queueable:

use App\Events\MessageProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;

Event::listen(queueable(function (MessageProcessed $event) {
    //
}));

Giống như queue jobs, bạn có thể sử dụng các phương thức onConnection, onQueuedelay để tuỳ chỉnh việc thực thi của queue listener.

Event::listen(queueable(function (MessageProcessed $event) {
    //
})->onConnection('redis')->onQueue('messages')->delay(now()
->addSeconds(10)));

Nếu muốn xử lý lỗi của anonymous queue listener, bạn có thể truyền một Closure cho phương thức catch khi khai báo queueable listener:

use App\Events\MessageProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;
use Throwable;

Event::listen(queueable(function (MessageProcessed $event) {
    //
})->catch(function (MessageProcessed $event, Throwable $e) {
    // The queued listener failed...
}));

🌺 Time Testing Helpers

Khi testing, bạn có thể sẽ muốn thay đổi thời gian trả về bởi helper như now hoặc Illuminate\Support\Carbon::now(). Từ bây giờ, class base feature test của Laravel sẽ có các helper cho phép bạn thao tác với thời gian hiện tại:

public function testTime()
{
    // Login...
    $this->login(5)->milliseconds();
    $this->login(5)->seconds();
    $this->login(5)->minutes();
    $this->login(5)->hours();
    $this->login(5)->days();
    $this->login(5)->weeks();
    $this->login(5)->years();

    // Login into the past...
    $this->login(-5)->hours();

    // Login to an explicit time...
    $this->loginTo(now()->subHours(6));

    // Return back to the present time...
    $this->loginBack();
}

🌻 Tailwind Pagination Views

Paginator của Laravel được cập nhật, update thêm template cho Tailwind CSS.

Các template cho phân trang được tùy biến mới:

🌷 Gửi Job batching vào queue

Job batching là một tính năng mạnh mẽ mới có trong Laravel 8. Nó sẽ cho phép bạn gửi nhiều Job vào hàng đợi cùng một lúc (trong một “batch”) để được xử lý đồng thời (giả sử bạn có đủ queue worker đợi đang chạy) và đăng ký các callback để kích hoạt khi tất cả các Job đã hoàn thành. Có 3 callback có sẵn, đó là:

  • then() - sẽ kích hoạt khi tất cả các Job trong batch đã hoàn thành và thành công.
  • catch() - sẽ kích hoạt khi có lỗi xảy ra trong batch.
  • finally() - sẽ kích hoạt khi tất cả các Job trong batch đã hoàn thành thực thi (một số có thể đã thành công, một số có thể không)

Tất cả các callback đều có quyền truy cập vào đối tượng $batch chứa nhiều phương thức khác nhau - chẳng hạn như kiểm tra trạng thái, xác định xem có lỗi không, hủy batch, v.v. Ví dụ, chúng ta có thể sử dụng $batch trong catch() để dừng phần còn lại của batch nếu có lỗi xảy ra.

Đây là cách sử dụng để bạn có thể tương tác với batch:

use App\Jobs\ProcessMessage;
use App\Message;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Batch;
use Throwable;

$batch = Bus::batch([
new ProcessMessage(Message::find(1)),
new ProcessMessage(Message::find(2)),
new ProcessMessage(Message::find(3)),
new ProcessMessage(Message::find(4)),
new ProcessMessage(Message::find(5)),
])->then(function (Batch $batch) {
// All jobs completed successfully...
})->catch(function (Batch $batch, Throwable $e) {
// First batch job failure detected...
})->finally(function (Batch $batch) {
// The batch has finished executing...
})->dispatch();

return $batch->id;

Ngoài ra còn có các tính năng nâng cao như khả năng thêm các Job khác vào một batch hiện có từ bên trong một Job trong batch đó bằng cách gọi $this->batch() trong một Job bất kỳ. Điều này có thể hữu ích nếu bạn đang xử lý một lượng lớn dữ liệu và cần phải làm việc với chunk.

Nếu bạn có UUID của batch, có một phương thức helper khác có sẵn trên Bus Bus::findBatch($batchUuid). Thao tác này sẽ trả về một đối tượng chứa thông tin về batch - bao gồm cả tiến trình hiện tại. Bạn có thể sử dụng nó để hiển thị tiến trình theo thời gian thực của batch trong giao diện người dùng bằng AJAX.

🌹Tùy chỉnh thời gian thử lại sau mỗi Job failed

Bắt đầu với Laravel 8, bạn có thể thêm một phương thức backoff() mới vào các Job class của mình để trả về một mảng các số nguyên nhằm quyết định thời gian chờ giữa các lần thử nếu không thành công - ví dụ:

class ExampleJob{
public function backoff() {
return [1, 5, 10];
}
}

VD: nếu Job không thành công trong lần thử đầu tiên, nó sẽ đợi 1 giây trước khi thử lại. Nếu Job sau đó tiếp tục không thành công trong lần thử thứ hai, nó sẽ đợi 5 giây trước khi thử lại. Sau đó, nếu Job vẫn không thành công vào lần thứ ba (và các lần sau), nó sẽ phải đợi 10 giây trước khi được tiếp tục thử lại.

Điều này có thể rất hữu ích nếu bạn đang làm việc với một API giới hạn số lượt truy cập để tăng thời gian chờ đợi mỗi khi Job không thành công.

🙂😀😄😆. Vậy là sau 1 series gồm ba bài về những điểm mới của Laravel 8, chắc hẳn các bạn đã có thể hiểu và nắm rõ phần nào những khái niệm và điểm cải tiến của phiên bản mới này so với những bản tiền nhiệm trước rồi phải không.

Hãy đọc kĩ lại một vài lần nữa cho ngấm nhé mọi người, chắc hẳn mọi người có thể tìm thấy những điểm rất thú vị nữa khác đó 💑

Source tham khảo : https://laravel.com/docs/8.x/releases

Cảm ơn bạn đã theo dõi 🥰🥰🥰

Tags

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.