I am passionate about adopting new technologies and thrive in dynamic environments.

Telegram

@hxdvn

Social Links

Web Development

Ôn lại mớ kiến thức bị lãng quên - Khái niệm Bind và Singleton trong Laravel, khác biệt giữa chúng và khi nào nên sử dụng?

Tiếp tục series "Ôn lại mớ kiến thức bị lãng quên" hôm nay mình sẽ nói về Khái niệm Bind và Singleton trong Laravel.

Ôn lại mớ kiến thức bị lãng quên - Khái niệm Bind và Singleton trong Laravel, khác biệt giữa chúng và khi nào nên sử dụng?

Trong Laravel, Service Container là một thành phần quan trọng giúp quản lý Dependency Injection một cách hiệu quả. Hai phương thức phổ biến để đăng ký dịch vụ trong Service Container là bind()singleton(). Mặc dù cả hai đều dùng để đăng ký một service, nhưng chúng có sự khác biệt về vòng đời của instance.  

 

1. bind(): Tạo một instance mới mỗi lần gọi 

Phương thức bind()trong Laravel được sử dụng để đăng ký một service theo kiểu transient. Điều này có nghĩa là mỗi lần bạn gọi service, một instance mới sẽ được tạo.  

Ví dụ sử dụng bind()  

use App\Services\MyService; 
use Illuminate\Support\ServiceProvider; 

class AppServiceProvider extends ServiceProvider 
{ 
    public function register() 
    { 
        $this->app->bind(MyService::class, function ($app) { 
            return new MyService(); 
        }); 
    } 
}

Khi nào nên sử dụng bind()?  

  • Khi bạn cần một instance mới mỗi lần service được gọi.
  • Khi service có trạng thái riêng biệt và không nên chia sẻ giữa các request.  
  • Ví dụ: xử lý request, gửi email hoặc thực hiện các thao tác không cần dùng lại instance.  

     

2. singleton(): Dùng chung một instance duy nhất  

Phương thức singleton()giúp đăng ký một service theo kiểu singleton, tức là chỉ tạo một instance duy nhất trong suốt vòng đời ứng dụng. Mỗi lần bạn gọi service sau lần đầu tiên, Laravel sẽ trả về cùng một instance đã được tạo trước đó.  

Ví dụ sử dụng singleton()  

use App\Services\MyService; 
use Illuminate\Support\ServiceProvider; 

class AppServiceProvider extends ServiceProvider 
{ 
    public function register() 
    { 
        $this->app->singleton(MyService::class, function ($app) { 
            return new MyService(); 
        }); 
    } 
}

Khi nào nên sử dụng singleton()?  

  • Khi bạn muốn dùng một instance chung xuyên suốt ứng dụng để tối ưu hiệu suất.
  • Khi service không cần phải tạo mới liên tục.  
  • Ví dụ: caching, logging, database connection, queue manager.  

     

3. So sánh bind()singleton() 

Đặc điểm  bind()(Transient)  singleton()(Singleton)  
Số lần khởi tạo  Mỗi lần gọi tạo mới  Chỉ tạo một lần, dùng lại  
Khi nào dùng?  Khi cần instance riêng biệt mỗi lần gọi  Khi muốn tối ưu hiệu suất với một instance duy nhất  

 

4. Kiểm tra sự khác biệt giữa bind()singleton() 

Bạn có thể thử kiểm tra sự khác biệt giữa hai phương thức này bằng cách inject service vào một controller:  

use App\Services\MyService; 

class TestController extends Controller 
{ 
    public function index(MyService $service1, MyService $service2) 
    { 
        dd($service1 === $service2); 
    } 
}
  • Nếu bạn dùng bind(), kết quả sẽ là false(vì mỗi lần gọi tạo một instance mới).
  • Nếu bạn dùng singleton(), kết quả sẽ là true(vì cùng một instance được dùng lại).  

 

5. Làm thế nào để sử dụng bind()singleton()hiệu quả  

1. Chỉ sử dụng singleton()khi thực sự cần thiết  

  • Nếu service của bạn có trạng thái thay đổi theo thời gian hoặc phụ thuộc vào request hiện tại, hãy sử dụng bind()thay vì singleton()để tránh lỗi không mong muốn.  

2. Kết hợp singleton()với cache để tăng hiệu suất  

  • Khi làm việc với caching, bạn có thể lưu instance trong singleton()để giảm số lần truy vấn database không cần thiết.  

3. Dùng bind()cho các service xử lý dữ liệu ngắn hạn  

  • Các service như xử lý file tạm thời, gửi request HTTP hoặc tính toán dữ liệu động nên được đăng ký bằng bind()để đảm bảo tính độc lập của mỗi request.  

4. Sử dụng scoped()nếu cần reset instance sau mỗi request  

  • Nếu bạn cần một instance được chia sẻ trong một request nhưng reset khi request kết thúc, có thể dùng $this->app->scoped(MyService::class, function ($app) {...})thay vì singleton().  

 

 

5 min read
Mar 30, 2025
By Xuân Dũng Hồ
Share

Related posts

Mar 27, 2026 • 8 min read
Cài GoClaw trực tiếp lên Ubuntu từ đầu, không Docker, ai cũng làm được

Hướng dẫn cài GoClaw bare metal trên Ubuntu 24.04+ từ con số không: Go...

Mar 01, 2026 • 8 min read
Quản lý nhiều dự án và hàng chục người cùng lúc mà không phát điên, câu trả lời của tôi cho câu hỏi "sếp giao thêm dự án mới, nên từ chối hay không?"

Hế nô anh em, lại cuối tuần rồi, lại rảnh nên tôi viết cái bài này. Ma...

Feb 23, 2026 • 14 min read
Đôi khi, quyết định chuyên nghiệp nhất là nói "không" với công nghệ hay nhưng không phù hợp.

Quyết định kiến trúc tốt nhất không phải cái fanciest. Nó là cái giải...

Your experience on this site will be improved by allowing cookies.