-
-
Notifications
You must be signed in to change notification settings - Fork 1
Feature Extensions
github-actions[bot] edited this page Jul 8, 2026
·
1 revision
Механизм подключения сторонних пакетов (расширения) и сквозной обработки графа (compiler passes) — аналог bundle-extensions + compiler passes Symfony и DI-extensions Nette.
-
Расширение реализует
ContainerExtensionInterface::load($container)— регистрирует сервисы пакета. Подключается черезregisterExtension($ext), который сразу вызываетload(). -
Compiler pass реализует
CompilerPassInterface::process($container)— модифицирует граф после регистрации всех сервисов. Копится черезaddCompilerPass($pass)и выполняется вbuild().
Порядок: подключаете расширения → добавляете проходы → build() прогоняет проходы → (опционально) freeze().
$c = new Container();
$c->registerExtension(new CachePackageExtension()); // пакет регистрирует свои сервисы
$c->registerExtension(new QueuePackageExtension());
$c->addCompilerPass(new class implements CompilerPassInterface {
public function process(ContainerInterface $c): void {
// собрать все реализации по тегу и связать с потребителем
$c->set('listeners.ids', $c->getTaggedIds('event.listener'));
}
});
$c->build(); // прогон проходов после регистрации всего графа
$c->freeze(); // зафиксировать-
Экосистема пакетов: сторонний код подключается одной строкой (
registerExtension), не зная деталей приложения. - Сквозная сборка: compiler pass видит весь граф — идеально для «собрать по тегу и связать», валидации, подмены определений.
- Явный
build()— предсказуемая точка сборки передfreeze().
- Расширения выполняются сразу при
registerExtension(нет отдельной фазы «сначала все load, потом все process», кромеbuild()для проходов). - На compiled-контейнере недоступно — расширения/проходы применяются до компиляции на runtime-контейнере.
- Пакеты — через
ContainerExtensionInterface; кросс-модульную проводку (tagged → потребитель) — через compiler pass. - Вызывать
build()один раз в конце bootstrap, затемfreeze().
- Тяжёлая логика/IO в
load()илиprocess()— это фаза сборки графа, а не работы приложения. - Взаимозависимый порядок расширений, где пакет A требует, чтобы B загрузился раньше, — делайте связывание в compiler pass, а не в порядке
registerExtension.
| Контейнер | Аналог |
|---|---|
| PHP-DI | нет механизма расширений/проходов (❌) |
| Symfony | bundle extensions + compiler passes (эталон) |
| Laravel | service providers ( |
| Pimple |
ServiceProviderInterface ( |
| Nette | DI extensions (loadConfiguration / beforeCompile) |
CloudCastle, Symfony, Nette — расширения + сквозные проходы.
См. также: Теги и tagged services · Autoconfigure.
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