Khác nhau ở vòng đời của object mà container trả về.
bind— resolve mỗi lần một instance mới. Dùng cho object có state riêng theo lần dùng.singleton— resolve một lần, các lần sau trả lại đúng object đó trong suốt vòng đời process. Hợp với service không state nhưng tốn chi phí khởi tạo: HTTP client, SDK, serializer.scoped— như singleton nhưng bị xoá khi bắt đầu vòng đời mới (request mới trong Octane, job mới trong queue worker). Dùng cho service giữ dữ liệu theo request.instance— đăng ký sẵn một object đã tạo, container trả về nguyên object đó.
php
$this->app->bind(ReportBuilder::class); // mới mỗi lần
$this->app->singleton(SepayClient::class, fn ($app) => new SepayClient(config('services.sepay')));
$this->app->scoped(RequestContext::class); // reset theo request/jobBẫy hay gặp: dùng singleton cho service có state theo user/request. Trên PHP-FPM thường không lộ vì mỗi request là một process mới, nhưng khi chạy Octane (worker sống lâu) thì state của user A rò sang request của user B. Với worker sống lâu, chọn scoped hoặc bind.
Còn có contextual binding khi hai class cần hai implementation khác nhau của cùng interface:
php
$this->app->when(PhotoController::class)
->needs(Filesystem::class)
->give(fn () => Storage::disk('s3'));