Ответ
Dependency Injection (DI, внедрение зависимостей) — это архитектурный паттерн, при котором зависимости объекта (сервисы, которые он использует) не создаются им самим, а предоставляются ("внедряются") извне, обычно через конструктор, метод-сеттер или свойство. Это реализация принципа инверсии зависимостей (D из SOLID).
Проблема (жёсткая связь):
class OrderProcessor {
private $mailer;
public function __construct() {
// Класс сам создаёт конкретную реализацию. Замена или тестирование усложнены.
$this->mailer = new SmtpMailer();
}
}
Решение через DI (внедрение через конструктор):
class OrderProcessor {
private $mailer;
// Зависимость передаётся извне. Класс теперь зависит от абстракции (интерфейса).
public function __construct(MailerInterface $mailer) {
$this->mailer = $mailer;
}
public function process(Order $order) {
// ... логика обработки ...
$this->mailer->sendConfirmation($order->getUserEmail());
}
}
// Где-то в композиции корня приложения (или в контейнере) создаём зависимости:
$mailer = new SmtpMailer(); // или new SendgridMailer(), или new MockMailer() для тестов
$processor = new OrderProcessor($mailer); // ВНЕДРЕНИЕ
Преимущества:
- Тестируемость: Легко подменить реальную зависимость (например, отправку почты) на mock-объект в юнит-тестах.
- Гибкость и слабая связность: Код зависит от интерфейса, а не от конкретной реализации. Реализацию можно менять, не трогая основной класс.
- Повторное использование: Классы становятся более универсальными.
- Явные зависимости: По конструктору сразу видно, от чего зависит класс.
Контейнер внедрения зависимостей (DIC) — это инструмент (например, Symfony Container, PHP-DI), который автоматизирует процесс: он знает, как создавать объекты и рекурсивно разрешает их зависимости.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶