-
-
Notifications
You must be signed in to change notification settings - Fork 1
Feature Autoconfigure
github-actions[bot] edited this page Jul 8, 2026
·
1 revision
autoconfigure($type, $tag) авто-тегирует каждый autowired-класс, реализующий/расширяющий $type — не нужно вручную tag() по каждой реализации. Аналог Symfony _instanceof / autoconfigure.
Правило хранится как «тип → теги». Применяется в обе стороны:
-
ретроспективно — при вызове
autoconfigure()помечаются уже зарегистрированные autowired-классы, подходящие по типу; -
вперёд — каждый последующий
autowire()/scan()/bind()проверяет правила и авто-тегирует класс, если он реализует тип (is_a($class, $type, true)— без создания экземпляра).
Дальше группа доступна через обычные теги: getTaggedIterator(), getTaggedLocator().
$c->enableAutowiring();
$c->autoconfigure(HandlerInterface::class, 'handlers'); // правило
$c->scan(__DIR__ . '/Handlers'); // все реализации HandlerInterface
$c->autowire(ExtraHandler::class); // тоже попадёт в 'handlers'
foreach ($c->getTaggedIterator('handlers') as $handler) { // без ручного tag()
$handler->handle();
}- Convention over configuration: новая реализация интерфейса автоматически попадает в группу — ноль правок конфигурации.
- Работает и до, и после регистрации классов (порядок вызовов не важен).
- Проверка по типу без инстанцирования (
is_a(..., true)).
- Пока покрывает авто-тегирование (не авто-вызовы методов/биндов, как расширенный
_instanceofSymfony). - Применяется к autowired-классам (scan/autowire/bind) — сервисы, заданные голым замыканием без класса, правило не видит.
- Собирать плагины/хендлеры/подписчиков:
autoconfigure(EventSubscriberInterface::class, 'subscribers')+scan(). - Задавать правила в composition root, до
scan()(или после — сработает ретроспективно).
- Автотегировать слишком широкий тип (например маркерный интерфейс на пол-приложения) — группа станет свалкой.
- Полагаться на autoconfigure для сервисов без известного класса (замыкания) — их тегируйте явно через
tag().
| Контейнер | Аналог |
|---|---|
| PHP-DI | нет прямого _instanceof ( |
| Symfony |
_instanceof / registerForAutoconfiguration() (эталон, + calls/bind) |
| Laravel | тегирование + #[Give]; autoconfigure по интерфейсу — частично |
| Pimple | нет (❌) |
| Nette |
search + автотегирование по типу |
CloudCastle, Symfony, Laravel, Nette — CloudCastle закрывает основной кейс (авто-тег по типу).
См. также: Теги и tagged services · Сканирование каталога.
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