Skip to content

Feature Constructor autowiring

github-actions[bot] edited this page Jul 8, 2026 · 1 revision

🤖 Constructor autowiring

← Возможности · Главная · Сравнение

Контейнер сам разрешает зависимости конструктора по типам параметров — не нужно писать фабрику для каждого класса.

Принцип работы

При enableAutowiring() запрос get(FQCN) / make(FQCN) уходит в Autowirer: он через рефлексию читает конструктор, для каждого типизированного параметра рекурсивно разрешает зависимость из контейнера, создаёт экземпляр и (для get) кэширует его. Результаты рефлексии кэшируются (ctorResolverCache), поэтому повторная сборка того же класса быстрая — autowire-граф в CloudCastle быстрее аналогов (см. Производительность).

final class ReportService
{
    public function __construct(
        private Db $db,
        private LoggerInterface $log,
    ) {}
}

$c->enableAutowiring();
$c->bind(LoggerInterface::class, FileLogger::class);

$svc = $c->get(ReportService::class); // Db и FileLogger собраны автоматически

Autowiring можно ограничить: включать не глобально, а для конкретных классов через autowire(FQCN).

Плюсы

  • Меньше boilerplate: классы с типизированным конструктором собираются без ручных фабрик.
  • Рефакторинг-safe: добавили зависимость в конструктор — контейнер сам её подставит.
  • Кэш рефлексии → минимальная цена повторной сборки.

Минусы

  • Рефлексия при первом разрешении дороже явной фабрики (нивелируется кэшем и compiled-контейнером).
  • «Магия»: неочевидно, что и откуда пришло, если злоупотреблять глобальным autowiring.
  • Скалярные параметры (строки, int) autowiring не угадает — их нужно задать явно (contextual / фабрика).

✅ Рекомендуется

  • Типизировать все зависимости конструктора (интерфейсами предпочтительно) — это контракт для контейнера.
  • В проде включать compiled container — autowiring без рефлексии в рантайме.
  • Явно bind()-ить интерфейсы на реализации.

❌ Антипаттерны

  • «God-конструкторы» с 8+ зависимостями — признак нарушения SRP, а не повод для autowiring.
  • Автоувязка классов с побочными эффектами в конструкторе (запросы, IO) — конструктор должен только присваивать.

Аналоги в других контейнерах

Контейнер Аналог
PHP-DI autowiring по умолчанию (рефлексия / compiled)
Symfony autowire: true в конфиге
Laravel автоматический constructor injection
Pimple нет (❌ — только ручные фабрики)
Nette автоувязка по типам

Все кроме Pimple; CloudCastle — быстрейший autowire-граф в честных замерах.

См. также: Property и method injection · Attribute autowiring.

Clone this wiki locally