-
-
Notifications
You must be signed in to change notification settings - Fork 1
Comparison
CloudCastle DI — lightweight PSR-11 dependency injection container for PHP 8.3+.
На этой странице — подробное сравнение по шагам: для каждого критерия указаны плюсы и минусы CloudCastle DI относительно аналога. Краткая выжимка — в README и doc/guide/comparison.rst.
- Пройдите шаг 1 (чеклист требований) — поймёте, какие аналоги вообще рассматривать.
- Шаги 2–5 — пошаговое сравнение с каждым контейнером (таблица: критерий → CloudCastle → аналог → вывод).
- Шаг 6 — итоговые преимущества и недостатки CloudCastle DI.
- Шаг 7 — матрица выбора и миграция.
Отметьте, что важно для вашего проекта:
| # | Вопрос | Если «да» → смотрите |
|---|---|---|
| 1.1 | Уже используете Symfony или Laravel? | Встроенный DI фреймворка (шаг 4 / 5) |
| 1.2 | Нужно < 10 сервисов без autowiring? | Pimple (шаг 2) |
| 1.3 | Нужен compiled container или contextual binding в production сейчас? | PHP-DI / Symfony (шаг 3 / 4) |
| 1.4 | Нужен standalone контейнер в библиотеке, CLI, API, тестах? | CloudCastle DI (шаги 3–6) |
| 1.5 | Важна одна runtime-зависимость (psr/container)? |
CloudCastle DI, Pimple |
| 1.6 | Нужен PHP < 8.3? | Pimple, старый PHP-DI — не CloudCastle DI |
Если пункты 1.4–1.5 актуальны, а 1.1 и 1.3 — нет, переходите к шагам 2–5.
Pimple — микро-контейнер на замыканиях.
| Шаг | Критерий | CloudCastle DI | Pimple | Вывод |
|---|---|---|---|---|
| 2.1 | Зависимости | psr/container |
нет (PSR через адаптер) | Оба лёгкие; CloudCastle — явный PSR-11 |
| 2.2 | Регистрация | set(id, instance|callable) |
$p[id] = fn |
Похожая модель; API PSR-11 удобнее для interchange |
| 2.3 | Autowiring | reflection, attributes, by-name | нет | + CloudCastle — меньше boilerplate |
| 2.4 | Property / method inject | да | нет | + CloudCastle |
| 2.5 | Сканирование каталогов | scan() |
нет | + CloudCastle |
| 2.6 | Теги, декораторы |
tag(), decorate()
|
нет | + CloudCastle |
| 2.7 | call() / bind() / hooks |
да (v1.3) | нет | + CloudCastle |
| 2.8 | Простота | больше API | минимум кода | + Pimple для 3–5 сервисов |
| 2.9 | Старые PHP | ^8.3 | 7.2+ | + Pimple на legacy |
Итог шага 2: Pimple — если граф крошечный и без autowiring. CloudCastle DI — осмысленный апгрейд с Pimple без перехода на Symfony.
PHP-DI — ближайший функциональный аналог.
| Шаг | Критерий | CloudCastle DI | PHP-DI | Вывод |
|---|---|---|---|---|
| 3.1 | Composer runtime | psr/container |
php-di/php-di + транзитивные |
+ CloudCastle для micro-library |
| 3.2 | Старт | new Container() |
ContainerBuilder + definitions |
+ CloudCastle — быстрее войти |
| 3.3 | Явный set() / get() |
да | да | Паритет |
| 3.4 | Autowiring | constructor, property, method; union, intersection | да | Паритет для типичных кейсов |
| 3.5 | Attributes |
Inject, Autowire
|
да | Паритет |
| 3.6 | scan() |
regex по файлам | да | Паритет; у обоих есть ограничения scan |
| 3.7 | Теги, iterator, locator | да | да | Паритет |
| 3.8 | make(), lazy, alias |
да | да | Паритет |
| 3.9 | call(), bind(), afterResolving |
да (v1.3) | да | Паритет |
| 3.10 | Compiled container | нет (v2 backlog) | да, production | + PHP-DI на огромных графах |
| 3.11 | Contextual binding | нет (v2 backlog) |
when / needs / attributes |
+ PHP-DI сейчас |
| 3.12 | Зрелость / статьи / community | молодой проект | годы в prod | + PHP-DI |
| 3.13 | PHP версия | ^8.3 | 8.1+ | + PHP-DI на 8.1–8.2 |
Итог шага 3: при паритете API CloudCastle выигрывает лёгкостью и прозрачностью; PHP-DI — если нужны compiler и contextual injection уже сегодня.
Миграция PHP-DI → CloudCastle: set/get/autowire переносятся напрямую; definitions YAML — в ContainerConfigurator или PHP bootstrap; DI\env() — в PHP; contextual rules — пересмотреть вручную или дождаться v2.
| Шаг | Критерий | CloudCastle DI | Symfony DI | Вывод |
|---|---|---|---|---|
| 4.1 | Зависимости | psr/container |
symfony/config, yaml, … | + CloudCastle вне Symfony |
| 4.2 | Конфигурация | PHP bootstrap или PHP/JSON/YAML/XML (ContainerConfigurator) |
YAML/XML/PHP + compiler | Symfony гибче в monolith (compiler, autoconfigure) |
| 4.3 | Autowiring | reflection + attributes | + autoconfigure, _instanceof
|
+ Symfony в больших apps |
| 4.4 | Теги и декораторы |
tag(), decorate()
|
config + compiler passes | Паритет по возможностям |
| 4.5 | Lazy loading |
LazyService обёртка |
ghost proxies | + Symfony для тяжёлых объектов |
| 4.6 | Scopes (request и т.д.) | v2 backlog | да | + Symfony |
| 4.7 | Compiled container | нет | да | + Symfony на cold start SLA |
| 4.8 | Интеграция с фреймворком | нет | EventDispatcher, Security, … | + Symfony в Symfony-проекте |
| 4.9 | Использование вне Symfony | да, нативно | возможно, но тяжело | + CloudCastle |
Итог шага 4: в Symfony-приложении — Symfony DI. CloudCastle DI — когда Symfony DI избыточен, но Pimple мал.
Миграция Symfony → CloudCastle: перенесите services.yaml в ContainerConfigurator (YAML/XML/JSON) или в set() / bind() / scan(); autoconfigure замените явными tag() / autowire().
Laravel Container (illuminate/container).
| Шаг | Критерий | CloudCastle DI | Laravel | Вывод |
|---|---|---|---|---|
| 5.1 | Standalone | да | часть фреймворка | + CloudCastle вне Laravel |
| 5.2 | PSR-11 | да | да (v8+) | Паритет |
| 5.3 | Contextual binding | v2 | да | + Laravel |
| 5.4 | Service providers | нет | да | + Laravel |
| 5.5 | Фасады, kernel | нет | да | + CloudCastle — без магии |
Итог шага 5: в Laravel — встроенный контейнер. CloudCastle DI — для non-Laravel PHP.
Сводка после шагов 2–5.
| # | Преимущество | Проявляется при сравнении с |
|---|---|---|
| +1 | Одна runtime-зависимость psr/container
|
PHP-DI, Symfony |
| +2 | Явный PHP bootstrap или декларативные файлы без compiler | Symfony, PHP-DI (compiled) |
| +3 | Полный PSR-11 + расширенный API | Pimple |
| +4 | Autowiring, attributes, property/method inject, registerAttribute()
|
Pimple |
| +5 |
scan(), теги, декораторы, call(), bind(), hooks |
Pimple |
| +6 | Прототипы, alias, lazy | Pimple (частично) |
| +7 | Компактный код — проще аудит | PHP-DI, Symfony |
| +8 | Подходит для библиотек, CLI, тестов | Symfony, Laravel |
| +9 | Циклы при autowiring детектируются | — |
| +10 | MIT, открытый CI, Wiki с архитектурой | — |
| # | Недостаток | Обход / альтернатива |
|---|---|---|
| −1 | Нет compiled container | PHP-DI, Symfony; план v2 (#24) |
| −2 | Нет contextual binding | PHP-DI, Symfony; план v2 (#25) |
| −3 | Нет autoconfigure / compiler как в Symfony | Symfony; YAML/XML через ContainerConfigurator (v1.5) |
| −4 | Нет lazy ghost proxy | Symfony; план (#34) |
| −5 | Нет scopes (request) | Symfony, Laravel; v2 (#33) |
| −6 | Только PHP ^8.3 | PHP-DI, Pimple на старых версиях |
| −7 |
scan() — regex, не AST |
явный autowire() / set()
|
| −8 | Циклы в фабриках set() не ловятся |
проектирование, lazy |
| −9 | Меньше community, чем у PHP-DI/Symfony | Wiki, Discussions |
| −10 | Не интегрирован в kernel фреймворка | Symfony/Laravel native DI |
- Не Symfony / не Laravel (или отдельный composition root)
- Нужен autowiring и теги без тяги фреймворка
- Граф от ~10 до сотен сервисов
- PHP 8.3+
- Compiled container и contextual binding не блокеры сейчас
flowchart TD
start[Шаг 1: нужен DI] --> fw{Symfony / Laravel?}
fw -->|Да| native[Встроенный DI фреймворка]
fw -->|Нет| tiny{До 10 сервисов без autowire?}
tiny -->|Да| pimple[Pimple]
tiny -->|Нет| enterprise{Compiled / contextual сейчас?}
enterprise -->|Да| heavy[PHP-DI или Symfony DI]
enterprise -->|Нет| cc[CloudCastle DI]
cc --> ccfeat[PHP bootstrap или ContainerConfigurator PHP JSON YAML XML]
| Из | Действия |
|---|---|
| Pimple |
$p['id'] → set() / get(); enableAutowiring() для FQCN |
| PHP-DI | definitions → set() / bind() / scan(); убрать compiler config |
| Symfony | выборочно из services.yaml в PHP; теги → tag() / getTaggedIterator()
|
Подробнее — Быстрый старт, Обновление версий.
Для десятков–сотен get() / autowire CloudCastle DI сопоставим с reflection-контейнерами. Цифры — Нагрузка и производительность. На очень больших графах compiled Symfony / PHP-DI быстрее.
| Возможность | CloudCastle | PHP-DI | Symfony | Pimple |
|---|---|---|---|---|
| PSR-11 | ✓ | ✓ | ✓ | адаптер |
| Autowiring | ✓ | ✓ | ✓ | — |
scan() |
✓ | ✓ | ✓ | — |
| Теги / декораторы | ✓ | ✓ | ✓ | — |
call() / bind() / hooks |
✓ | ✓ | ✓ | — |
| Compiled / contextual | — | ✓ | ✓ | — |
| Минимум deps | ✓✓ | ✓ | — | ✓✓✓ |
- FAQ — краткие ответы
- Анти-паттерны
- Архитектура
- Roadmap v2
CloudCastle DI · Репозиторий · Packagist · Releases · Discussions · Issues
Исходники Wiki — wiki/ в репозитории (синхронизация через Actions).
- Архитектура
- Быстрый старт
- Сравнение с PHP-DI, Symfony, Pimple — пошагово
- Примеры bootstrap
- Autowiring
- Конфигурация из файлов
- Сканирование классов
- Глобальный реестр
- Теги и декораторы
- call(), bind(), afterResolving
- Прототипы, alias и lazy
- Справочник API
- Фабрики и singleton
- Тестирование
- Тесты безопасности
- Нагрузка и производительность
- Анти-паттерны