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.