Hai method chạy ở hai pha khác nhau của vòng khởi động ứng dụng.
register()chạy trước, cho mọi provider. Ở đây chỉ được bind vào container (bind,singleton,scoped). Không được đụng tới service của provider khác vì lúc này chưa chắc chúng đã được đăng ký.boot()chạy sau khi tất cả provider đã register xong. Đây là chỗ đăng ký event listener, route, view composer, Blade directive, macro, gate, validator rule — những thứ cần đến service khác.
php
public function register(): void
{
$this->app->singleton(PaymentGateway::class, fn () => new SepayGateway(config('services.sepay.key')));
}
public function boot(): void
{
Blade::directive('money', fn ($expr) => "<?= number_format($expr) ?>");
Event::listen(OrderPaid::class, SendInvoice::class);
}Lỗi hay gặp: gọi Route::, Event::listen hoặc resolve một service khác ngay trong register().
- Lúc chạy có thể vẫn qua, nhưng khi thứ tự nạp provider đổi (hoặc thêm package mới) sẽ ném lỗi "target class does not exist" hoặc nhận về instance chưa cấu hình.
- Quy tắc ngắn: register = khai báo, boot = sử dụng.