Модули верхнего уровня не должны зависеть от модулей нижнего уровня; оба должны зависеть от абстракций. Абстракции не должны зависеть от деталей; детали - от абстракций.
// Плохо: контроллер зависит от конкретной реализации
class OrderController { public function __construct(private MySqlOrderRepo $repo) {} }
// Хорошо: зависимость от интерфейса
class OrderController { public function __construct(private OrderRepositoryInterface $repo) {} }Резолв конкретной реализации - в конфигурации (DI-контейнер).