1. Mở đầu giang hồ?
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à, không có chút tuyệt kỹ nào.
Ví dụ, các hạ 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.
Nếu tại hạ viết:
if (rand(1, 100) <= 5) {
// Do something 5% of the time
}
Ờ thì cũng được, nhưng trông thiếu đạo hạnh, khó test, khó đọc, và không “Laravel” chút nào
2. Bí kíp cơ bản
Bộ pháp rất đơn giản:
Lottery::odds($successes, $total)
->winner(function () {
// Khi trúng "xổ số" 🎯
})
->loser(function () {
// Khi trượt "xổ số" 😭
})
->choose();
Ví dụ:
use Illuminate\Support\Lottery;
Lottery::odds(1, 10)
->winner(fn () => logger('Trúng 10% nè!'))
->loser(fn () => logger('Thua rồi...'))
->choose();
Câu trên nghĩa là: có 10% cơ hội thực thi callback “winner”.
Laravel sẽ tự sinh “số phận” cho mỗi lần chạy.
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. Vũ khí nâng cao
1. Sử dụng Lottery::odds() với cú pháp tinh gọn
Nếu chỉ cần biết có “trúng” hay không:
if (Lottery::odds(1, 50)->choose()) {
// 1/50 cơ hội
}
Rất hợp cho các tác vụ kiểu “thỉnh thoảng làm”:
if (Lottery::odds(1, 100)->choose()) {
Cache::flush(); // Lâu lâu dọn cache cho vui
}
2. Tùy chỉnh seed
Để đảm bảo kết quả “giống nhau” trong một phiên test, có thể thiết lập seed:
Lottery::odds(1, 10)->seed('example')->choose();
Cùng seed → cùng kết quả.
Khác seed → vận mệnh đổi thay.
“Giang hồ có thể loạn, nhưng test phải ổn định.” 😆
3. Dùng trong ứng dụng thực chiến
Ví dụ trong middleware:
public function handle($request, Closure $next)
{
if (Lottery::odds(1, 1000)->choose()) {
logger('Sample request log');
return $next($request);
}
}
Hoặc trong job queue:
if (Lottery::odds(1, 20)->choose()) {
$this->sendReport();
}
Hoặc trong sự kiện marketing:
if (Lottery::odds(1, 100)->choose()) {
event(new LuckyUserRewarded($user));
}
4. Điểm mạnh và yếu của tuyệt học này
| Thuộc tính | Ưu điểm | Nhược điểm |
|---|---|---|
| Cú pháp | Dễ đọc, rõ nghĩa, “chuẩn Laravel” | Hơi dư nếu chỉ cần random đơn giản |
| Ứng dụng | Tuyệt vời cho logging, sampling, thử nghiệm A/B | Không phù hợp cho game hoặc xác suất chính xác tuyệt đối |
| Test & debug | Có thể seed để tái tạo kết quả | Nếu quên seed, test có thể không ổn định |
| Tích hợp | Dễ dùng trong middleware, jobs, events | Không lưu trạng thái – hoàn toàn ngẫu nhiên mỗi lần gọi |
Tổng kết giang hồ
“Code mà không có random thì như trà mà không có đá – nhạt lắm!”
Laravel Lottery tuy nhỏ, nhưng cực kỳ hữu ích khi ta biết cách đặt nó đúng chỗ.
Nó giúp code vừa tinh gọn, vừa dễ đọc, vừa có linh hồn “may rủi” rất tự nhiên.
Còn nếu anh em đang viết hệ thống có tỷ lệ, sampling, logging —
hãy thử vận nội công với câu thần chú:
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.







