I am passionate about adopting new technologies and thrive in dynamic environments.
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.
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()
và 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.
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()
?
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.
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()
?
Ví dụ: caching, logging, database connection, queue manager.
bind()
và 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 |
bind()
và 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);
}
}
bind()
, kết quả sẽ là false
(vì mỗi lần gọi tạo một instance mới).singleton()
, kết quả sẽ là true
(vì cùng một instance được dùng lại).
bind()
và singleton()
hiệu quả 1. Chỉ sử dụng singleton()
khi thực sự cần thiết
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
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
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
$this->app->scoped(MyService::class, function ($app) {...})
thay vì singleton()
.
Your email address will not be published. Required fields are marked *