Dependency Injection روشی است که در آن یک کلاس وابستگی‌های موردنیاز خود را از بیرون دریافت می‌کند، به‌جای آنکه خودش آن‌ها را بسازد. این وابستگی‌ها معمولاً از طریق سازنده یا متد به کلاس داده می‌شوند.

این روش وابستگی به پیاده‌سازی مشخص را کاهش می‌دهد و تست‌نویسی را ساده‌تر می‌کند. Service Container می‌تواند ساخت و تزریق وابستگی‌ها را خودکار کند، اما DI مفهومی گسترده‌تر از Container است.

class OrderService {
    public function __construct(
        private PaymentGateway $gateway
    ) {}
}

یک مثال برای روشن‌تر شدن موضوع

در تست OrderService می‌توان یک FakePaymentGateway تزریق کرد تا بدون تماس با درگاه واقعی، وضعیت موفقیت و شکست پرداخت بررسی شود. همین انعطاف‌پذیری یکی از مزایای اصلی DI است.

درک تفاوت این موضوع با وارونگی کنترل و سرویس کانتینر به انتخاب راهکار مناسب‌تر کمک می‌کند.