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

Leave a comment

Your email address will not be published. Required fields are marked *

Related posts

Feb 23, 2025 • 17 min read
Ôn lại mớ kiến thức bị lãng quên - Apache Kafka

Thông qua bài này, bạn sẽ được trang bị những kiến thức cơ bản lẫn nân...

Jan 13, 2025 • 3 min read
SePay - Giải pháp thanh toán thông minh, tiết kiệm cùng mã khuyến mãi cực khủng

Quản lý tài chính và thanh toán chưa bao giờ dễ dàng đến thế với SePay...

Jan 09, 2025 • 4 min read
Đối tác cung cấp dịch vụ hosting vps tốt nhất mà tôi tin tưởng sử dụng - 123HOST

Nhớ lại cách đây khoảng 10 năm, từ những ngày đầu bắt đầu dấn thân vào...