🧠 Dependency Injection w Laravel — co to jest i jak tego używać?

Dependency Injection (DI) to jeden z fundamentów nowoczesnego backendu w PHP i Laravelu.

Brzmi skomplikowanie, ale idea jest prosta:

zamiast tworzyć zależności wewnątrz klasy — przekazujesz je z zewnątrz


❌ Problem bez Dependency Injection

class OrderService {
public function process() {
$payment = new StripePayment();
$payment->pay(100);
}
}

👉 problem:

  • klasa jest „przyklejona” do Stripe
  • ciężko testować
  • brak elastyczności

✅ Dependency Injection — rozwiązanie

class OrderService {
protected $payment;

public function __construct(PaymentInterface $payment) {
$this->payment = $payment;
}

public function process() {
$this->payment->pay(100);
}
}

👉 teraz:

  • możesz podać dowolną implementację
  • klasa nie wie jak działa płatność
  • jest bardziej elastyczna

🔧 Jak działa to w Laravel?

Laravel ma wbudowany Service Container, który sam rozwiązuje zależności.

Przykład:

class OrderController extends Controller {
public function __construct(OrderService $orderService) {
$this->orderService = $orderService;
}
}

👉 Laravel automatycznie:

  • tworzy OrderService
  • wstrzykuje zależności
  • zarządza cyklem życia obiektów

🔥 Binding w Service Container

Często używasz interfejsów:

interface PaymentInterface {
public function pay(float $amount): void;
}

Implementacja:

class StripePayment implements PaymentInterface {
public function pay(float $amount): void {
// płatność
}
}

Rejestracja w Laravel:

app()->bind(PaymentInterface::class, StripePayment::class);

👉 teraz Laravel wie:

  • jaką klasę podstawić pod interfejs

🧠 Typy Dependency Injection

1. Constructor Injection (najczęstsze)

public function __construct(Service $service)

👉 najlepsza opcja w 90% przypadków


2. Method Injection

public function index(Service $service)

👉 używane np. w kontrolerach


3. Setter Injection (rzadziej)

public function setService(Service $service)

👉 mniej popularne


🔥 Realny przykład (Laravel)

class ReportService {
public function generate() {
return "raport";
}
}

class ReportController extends Controller {
public function index(ReportService $reportService) {
return $reportService->generate();
}
}

👉 Laravel sam wstrzyknie ReportService


💣 Dlaczego DI jest ważne?

✔ łatwiejsze testowanie
✔ brak twardych zależności
✔ lepsza architektura
✔ możliwość podmiany implementacji


💡 TL;DR

  • DI = przekazywanie zależności zamiast tworzenia ich w klasie
  • Laravel robi to automatycznie
  • używaj głównie constructor injection

🚀 Podsumowanie

Dependency Injection to nie „pattern dla seniorów” — to podstawowy sposób pisania skalowalnego kodu.

Jeśli używasz Laravela i nie korzystasz z DI… to omijasz jedną z jego największych zalet.