Laravel nâng cao

Laravel Service Container: Giải mã 'Ma thuật' Dependency Injection

Service Container là trái tim của Laravel, nhưng cũng là phần khó hiểu nhất. Bài viết này sẽ giải thích nó một cách đơn giản dễ hiểu.

newspaper

Trần Bảo Sơn Nguồn

Laravel Daily 29 tháng 12, 2025
Laravel Service Container: Giải mã 'Ma thuật' Dependency Injection
Featured Image

Bạn đã bao giờ tự hỏi tại sao trong Controller, bạn chỉ cần type-hint Request $request là Laravel tự động “bơm” (inject) object Request vào cho bạn dùng không?

public function store(Request $request) { ... }

Đó không phải ma thuật. Đó là nhờ Service Container.

Dependency Injection (DI) là gì?

Hiểu đơn giản: Thay vì class A tự tạo ra class B (new ClassB()), class A sẽ “nhờ” ai đó đưa class B vào cho nó dùng. Việc này giúp code lỏng lẻo (loose coupling), dễ test và dễ thay thế.

Service Container là gì?

Service Container (hay IoC Container) là một cái cái Thùng chứa khổng lồ:

  1. Nơi bạn đăng ký (Bind) cách tạo ra các object.
  2. Nơi tự động giải quyết (Resolve) và tạo object cho bạn khi cần.

Cách sử dụng

1. Binding (Đăng ký)

Thường làm trong AppServiceProvider.

// Đăng ký đơn giản
$this->app->bind('PaymentService', function ($app) {
    return new StripePaymentService();
});

// Singleton (Chỉ tạo 1 lần duy nhất trong suốt vòng đời request)
$this->app->singleton('Logger', function ($app) {
    return new FileLogger();
});

2. Resolving (Lấy ra dùng)

// Cách thủ công
$payment = app('PaymentService');

// Cách xịn (Type-hinting trong Constructor hoặc Method)
public function __construct(PaymentService $payment) {
    $this->payment = $payment;
}

Laravel sử dụng Reflection API của PHP để tự động đọc type-hint và lấy đúng object từ Container đưa cho bạn.

Tại sao nó quan trọng?

  1. Dễ dàng thay đổi: Hôm nay bạn dùng StripePayment, ngày mai sếp bảo đổi sang Paypal. Bạn chỉ cần sửa đúng 1 dòng ở chỗ Binding (AppServiceProvider). Toàn bộ code trong Controller không cần sửa gì cả (miễn là 2 class đó cùng implement 1 Interface).
  2. Testable: Khi viết Unit Test, bạn có thể dễ dàng Mock (giả lập) các dependencies.

Service Container chính là thứ làm cho Laravel trở nên mạnh mẽ và linh hoạt như vậy.


Tham khảo Laravel Documentation.

history_edu Góc học tập & giải trí

Thử Thách Kiến Thức Lịch Sử?

Khám phá hàng trăm câu hỏi trắc nghiệm lịch sử thú vị tại HistoQuiz. Vừa học vừa chơi, nâng cao kiến thức ngay hôm nay!

Chơi Ngay arrow_forward
public

Laravel Daily

Nhà xuất bản gốc

Bài viết này được trích dẫn và tổng hợp từ Laravel Daily, nơi cung cấp các bài viết và tài liệu chất lượng cao.