0

Tìm Hiểu Cú Pháp isFullRequest: true & Kỹ Thuật Ghi Log Bằng Queue Trong PHP/Laravel

Khi đọc codebase trong các dự án PHP 8+ (đặc biệt là các hệ thống xử lý hàng đợi - Queue), chúng ta sẽ thỉnh thoảng bắt gặp các câu lệnh dispatch log có dạng:

LogSlackQueue::dispatch(
    __METHOD__ . ' - SendNextStockWarehouseChatJob',
    ['request' => $this->data, 'response' => $result],
    isFullRequest: true
);

Cú pháp isFullRequest: true nghĩa là gì? Tại sao lại có dấu hai chấm : ở giữa tham số như vậy? Bài viết này sẽ giải mã chi tiết từ mặt Cú pháp ngôn ngữ (Syntax) cho đến Ý nghĩa nghiệp vụ (Business Logic).

1. Về Cú Pháp: isFullRequest: Là Tải Trọng Của PHP 8 (Named Arguments)

Trước phiên bản PHP 8.0, khi bạn gọi một hàm có nhiều tham số mặc định (default parameters), nếu muốn thay đổi giá trị của tham số nằm ở tận cuối cùng, bạn bắt buộc phải truyền đầy đủ tất cả các tham số đứng trước nó.

So sánh cách viết:

Cách viết cũ (PHP 7 trở xuống): Giả sử hàm dispatch có signature: dispatch($title, $data, $channel = null, $level = 'info', $isFullRequest = false)

// Để đổi $isFullRequest thành true, bạn phải điền 'null' hoặc giá trị mặc định cho tham số 3 và 4
LogSlackQueue::dispatch(
    'Title',
    $data,
    null,   // $channel
    'info', // $level
    true    // $isFullRequest
);

(Cách này rất dễ gây nhầm lẫn vị trí tham số và code nhìn rất "rác")

Cách viết mới với Named Arguments (PHP 8+):

// Chỉ định trực tiếp tên tham số isFullRequest, bỏ qua hoàn toàn các tham số ở giữa!
LogSlackQueue::dispatch(
    __METHOD__ . ' - SendNextStockWarehouseChatJob',
    ['request' => $this->data, 'response' => $result],
    isFullRequest: true
);

Lợi ích: Code cực kỳ rõ ràng (Self-documenting), nhìn vào là biết ngay giá trị true đó đang bật cho tính năng gì mà không cần phải rê chuột vào định nghĩa hàm để xem tham số thứ 3, 4 là gì.

2. Về Nghiệp Vụ: Tại Sao Lại Cần isFullRequest: true Khi Log?

Trong các hệ thống lớn (Microservices, Logistics, E-commerce), dữ liệu truyền qua lại giữa các Request và Response có thể cực kỳ to và nặng (chứa hàng trăm dòng JSON, mảng lồng mảng). Nếu mỗi lần gọi API đều đẩy toàn bộ JSON khổng lồ đó lên các kênh như Slack, Telegram hay Elasticsearch:

  • Tràn màn hình chat: Tin nhắn Slack sẽ bị kéo dài lê thê, gây rối mắt cho team vận hành.
  • Tốn tài nguyên / Bị Rate Limit: Bắn payload quá lớn có thể khiến API của Slack từ chối tiếp nhận (Error 429 - Too Many Requests) hoặc làm giật lag hệ thống Log.

Do đó, các Class Log chuẩn thường có cơ chế:

  • Khi isFullRequest = false (Mặc định): Hàm log sẽ tự động cắt ngắn (truncate) dữ liệu, chỉ lấy vài trường thông tin chính hoặc giới hạn ký tự (ví dụ: tối đa 500 ký tự).
  • Khi truyền isFullRequest: true: Bạn đang phát đi một mệnh lệnh:

    "Tác vụ này (SendNextStockWarehouseChatJob) rất quan trọng hoặc đang cần debug kỹ. Hãy giữ nguyên 100% dữ liệu nguyên bản, có bao nhiêu field trong Request và Response thì ghi log ra hết, không được cắt bớt chữ nào!"

3. Phân Tích Chi Tiết Đoạn Code Ví Dụ

LogSlackQueue::dispatch(
    __METHOD__ . ' - SendNextStockWarehouseChatJob', // (1) Tiêu đề Log
    ['request' => $this->data, 'response' => $result], // (2) Nội dung Log
    isFullRequest: true                               // (3) Cờ giữ nguyên Full Data
);
  • __METHOD__ . ' - SendNextStockWarehouseChatJob': __METHOD__ là Magic Constant của PHP, trả về tên Class::Function đang chạy (ví dụ: App\Services\OrderService::chooseStock). Việc ghép thêm tên Job giúp biết chính xác log này xuất phát từ đâu.
  • ['request' => ..., 'response' => ...]: Đóng gói cả dữ liệu đầu vào ($this->data) và kết quả đầu ra ($result) thành mảng để dễ theo dõi sự tương quan khi debug.
  • isFullRequest: true: Đảm bảo không có trường dữ liệu nào trong $this->data hay $result bị ẩn hoặc cắt ngắn khi hiển thị trên Slack.

💡 Tóm Lược Nhanh

  • isFullRequest: Là tính năng Named Arguments của PHP 8, giúp gọi đích danh tham số mà không cần quan tâm thứ tự.
  • true: Là cờ (flag) yêu cầu hệ thống lưu trọn vẹn (Full Payload) của Request/Response vào Log để phục vụ việc debug chính xác nhất.

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí