Skip to content

Feature Autoconfigure

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

⚙️ Autoconfigure / _instanceof

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

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)).

Минусы

  • Пока покрывает авто-тегирование (не авто-вызовы методов/биндов, как расширенный _instanceof Symfony).
  • Применяется к 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 · Сканирование каталога.

Clone this wiki locally