-
-
Notifications
You must be signed in to change notification settings - Fork 1
Feature 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.
CloudCastle DI · · PHP 8.1+ · PSR-11
GitHub · Packagist · Releases · Discussions · Сравнение
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)
- 🏗️ Архитектура
- ⚡ Быстрый старт
- 📊 Сравнение — 5 аналогов, таблица + победители
- 🧩 Возможности (детально) — каждая фича: принцип, +/−, аналоги
- 🧪 Bootstrap
- 🚀 Compiled container
- 🔗 Contextual binding
- 🤖 Autowiring
- 📄 Конфигурация
- 📖 Справочник конфигурации
- 📂 Сканирование классов
- 🌍 Глобальный реестр
- 🏷️ Теги и декораторы
- 🔗 call(), bind(), hooks
- 🔄 Прототипы, alias, lazy, lazyGhost
- 📋 Справочник API
- 🏭 Фабрики и singleton