#1. Hành trình của một Request
Mọi yêu cầu đều bắt đầu từ public/index.php. Tại đây, Laravel thực hiện các bước sau:
- Khởi tạo Container: Tạo
Illuminate\Foundation\Application(cái “kho” chứa mọi thứ). - Bootstrappers: Chạy một chuỗi các lớp bootloader:
LoadEnvironmentVariables: Load file.env.LoadConfiguration: Nạp tất cả file trongconfig/.RegisterFacades&RegisterProviders: Đăng ký hệ thống.
- Boot Providers: Kích hoạt method
boot()của tất cả các provider.
#2. Register vs Boot: Bí mật của Senior
register(): Chỉ được phép bind service vào container. Tuyệt đối không gọi service khác vì có thể chúng chưa sẵn sàng.boot(): Chạy sau khi mọi thứ đã được đăng ký. Đây là nơi an toàn để setup routes, events, hoặc dùng các service khác.
#3. Câu hỏi nhanh
Q: Tại sao boot() lại chậm hơn register()?
A: Vì boot() diễn ra sau khi toàn bộ Dependency Graph đã được resolve. Nếu logic trong boot() gọi tới một service chưa được register, Container phải ép buộc resolve service đó ngay, gây ra xung đột thứ tự load.
Q: Làm sao để tạo provider load theo cấu hình (ví dụ: chỉ load nếu is_enabled=true)?
A: Sử dụng phương thức isDeferred() hoặc kiểm tra config() trực tiếp trong register(). Laravel sẽ không khởi tạo instance của provider đó nếu không cần thiết.
#4. Kết luận
Bootstrapping là quá trình biến một folder code thành một ứng dụng chạy được. Hiểu rõ nó giúp bạn tránh được lỗi “Service not found” oái oăm.