-
-
Notifications
You must be signed in to change notification settings - Fork 1
Feature Cycle detection
Если A зависит от B, а B — от A, наивный autowiring уходит в бесконечную рекурсию. CloudCastle обнаруживает цикл и бросает понятное исключение вместо зависания.
Во время autowiring контейнер держит стек разрешаемых id (resolving). Перед сборкой класса он проверяет, нет ли этого id уже в стеке; если есть — это цикл, и бросается ContainerException с цепочкой A → B → A. По завершении сборки id снимается со стека.
// A(B $b) и B(A $a) — циклическая зависимость
$c->enableAutowiring();
$c->get(A::class);
// ContainerException: обнаружена циклическая зависимость A → B → A
⚠️ В сравнительных security-тестах на таком графе Laravel зависает (DoS) — это реальная уязвимость доступности. CloudCastle, PHP-DI, Symfony, Nette цикл детектят.
- Fail-fast с понятной ошибкой вместо зависания процесса/таймаута.
- Защита доступности (нет DoS от кривого графа зависимостей).
- Цепочка в сообщении указывает, где разорвать цикл.
- Детекция — сигнал о проблеме дизайна: цикл нужно устранять, а не «обходить».
- Небольшая стоимость ведения стека (пренебрежимо мала на фоне рефлексии).
- Разрывать циклы через интерфейсы + lazy / lazyGhost (отложенное создание одной из сторон).
- Пересматривать дизайн: цикл обычно означает смешение ответственностей.
- Пытаться «победить» цикл setter-инъекцией, оставляя двунаправленную жёсткую связь.
- Игнорировать исключение и оборачивать в try/catch вместо исправления графа.
| Контейнер | Аналог |
|---|---|
| PHP-DI | детекция циклов ✅ |
| Symfony | детекция circular reference на компиляции ✅ |
| Laravel | нет — уходит в рекурсию/зависание (❌, DoS) |
| Pimple | нет autowiring (—) |
| Nette | детекция на компиляции ✅ |
CloudCastle, PHP-DI, Symfony, Nette детектят; Laravel — DoS.
См. также: Security-тесты · Lazy service.
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