1. Laravel Lottery là gì?
Laravel Lottery là một class nhỏ nhưng cực kỳ tiện lợi được thêm vào từ Laravel 10. Nó giúp bạn thực hiện các hành động theo xác suất, tức là cho phép một đoạn code chỉ chạy với tỉ lệ phần trăm nhất định — trước đây phải dùng mt_rand() hay random_int() khá rườm rà.
Ví dụ, bạn có thể muốn:
- Thỉnh thoảng log thêm thông tin debug.
- Chỉ gửi email thông báo cho 5% người dùng may mắn.
- Giảm tải một job tốn tài nguyên bằng cách chỉ chạy ngẫu nhiên.
Laravel Lottery sinh ra để giải quyết đúng những trường hợp đó, với cú pháp cực kỳ “Laravel style”.
2. Cú pháp cơ bản
Cú pháp rất đơn giản:
use Illuminate\Support\Lottery;
Lottery::odds(1, 10)->winner(function () {
info('Bạn đã trúng rồi!');
});
Câu lệnh trên nghĩa là:
Có 1/10 cơ hội để chạy callback
winner().
Nếu bạn muốn làm gì đó khi không trúng, có thể thêm loser():
Lottery::odds(1, 10)
->winner(fn () => info('🎉 Trúng rồi!'))
->loser(fn () => info('😅 Không trúng lần này.'));
3. Thực tế ứng dụng
Ghi log ngẫu nhiên để giảm tải
Thay vì log mọi request (sẽ khiến file log nặng), bạn chỉ log 1%:
Lottery::odds(1, 100)->winner(function () use ($request) {
Log::info('Random request sample', ['ip' => $request->ip()]);
});
Tui thì thấy log 1% thì thôi khỏi log luôn cho rồi.
Gửi quà ngẫu nhiên cho người dùng
Lottery::odds(5, 100)->winner(function () use ($user) {
$user->notify(new LuckyGiftNotification());
});
Cái này chắc phải thêm vô hệ thống game của MiniApp cho nó vip pro.
Giảm tần suất job tốn tài nguyên
Lottery::odds(1, 20)->winner(fn () => dispatch(new HeavyJob()));
4. Kiểm soát kết quả (testing)
Khi test, bạn có thể ép Lottery luôn thắng hoặc luôn thua để tránh sự ngẫu nhiên:
Lottery::alwaysWin();
Lottery::alwaysLose();
Điều này rất hữu ích trong unit test, giúp bạn kiểm soát logic mà không phải dựa vào may rủi.
5. Kết hợp với Facade hoặc Service
Bạn có thể gói Lottery vào service riêng để tạo ra các hành vi “ngẫu nhiên có kiểm soát”, ví dụ một class RewardService với các tỉ lệ trúng khác nhau theo từng loại người dùng.
class RewardService
{
public function tryGiveReward(User $user)
{
$odds = $user->isPremium() ? [1, 2] : [1, 10];
Lottery::odds(...$odds)->winner(function () use ($user) {
$user->reward('coffee_coupon');
});
}
}
6. Tổng kết
Laravel Lottery tuy nhỏ gọn nhưng mang lại nhiều giá trị trong việc:
- Giảm tải hệ thống bằng ngẫu nhiên có kiểm soát.
- Tạo trải nghiệm bất ngờ cho người dùng.
- Viết code sạch, dễ đọc và dễ test hơn nhiều so với random truyền thống.
Nếu bạn đang chạy hệ thống có scale lớn, hoặc cần “random sampling” một cách thanh lịch, Lottery chắc chắn là tính năng đáng thử trong Laravel 10+.
Tóm lại:
Laravel Lottery = “Xác suất + Sự tao nhã trong code”.
Dùng thử, và bạn sẽ thấy may mắn không chỉ đến từ người dùng đâu — mà còn đến từ chính code của bạn. 😄






