Trong Laravel (kể cả Laravel 12), bind() và singleton() đều dùng để đăng ký service vào Service Container, nhưng khác nhau ở vòng đời instance.
bind() – tạo instance mới mỗi lần resolve$this->app->bind(UserService::class, function ($app) {
return new UserService();
});
👉 Mỗi lần bạn gọi:
app(UserService::class);
➡️ Laravel sẽ tạo object mới hoàn toàn
bind()singleton() – dùng 1 instance duy nhất$this->app->singleton(CacheService::class, function ($app) {
return new CacheService();
});
👉 Dù gọi bao nhiêu lần:
app(CacheService::class);
➡️ Luôn trả về cùng 1 object
singleton()| Tiêu chí | bind() | singleton() |
|---|---|---|
| Instance | Mỗi lần mới | 1 instance duy nhất |
| Memory | Tốn hơn | Tiết kiệm hơn |
| State | Không giữ | Có thể giữ |
| Use case | Stateless service | Shared service |
Dùng singleton() cho service có state động:
class CartService {
public $items = [];
}
➡️ Nếu dùng singleton → user A add item, user B cũng thấy 😅
(vì share cùng instance trong lifecycle)
Với hệ thống lớn như bạn đang làm (multi-domain, queue, cache...):
singleton() phù hợp:
bind() phù hợp:
Laravel resolve dependency rất nhiều → nếu object nặng:
👉 Dùng singleton() + lazy load bên trong
(đỡ tạo nhiều object không cần thiết)
bind()singleton()