#1. Khi nào dùng gì?
- Bind: Cho các service cần tạo mới mỗi lần (VD:
PaymentGatewayphụ thuộc vàoOrder). - Singleton: Cho các service giữ state (VD:
Settings,Config,DatabaseConnection). - Scoped (Laravel 8+): Singleton nhưng chỉ tồn tại trong 1 request. Cực hữu ích để chia sẻ dữ liệu giữa các component trong cùng 1 request mà không sợ bị leak sang request sau.
#2. Bài học xương máu: Circular Dependency
Đây là lỗi kinh điển khi class A cần B, B cần C, C cần A.
- Giải pháp:
- Sử dụng Closure: Thay vì inject object, hãy inject closure:
function($app) { return $app->make(B::class); }. - Refactor: Nếu gặp lỗi này, nghĩa là thiết kế của bạn đang bị dính quá chặt (tight coupling). Hãy tách một phần logic chung ra một class thứ 3.
- Sử dụng Closure: Thay vì inject object, hãy inject closure:
#3. Tips cho Service Provider
- Đừng dùng
Route::gethayView::sharetrong methodregister(). Laravel chưa sẵn sàng. Hãy để dành chúng choboot(). - Deferred Provider: Nếu service của bạn rất nặng (VD: kết nối service AI, gọi API bên thứ 3), hãy implement
DeferrableProvider. Laravel sẽ chỉ load service đó khi nó được gọi thực sự. Giảm tải cho toàn bộ các request không dùng đến nó.