PSR-11 контейнер внедрения зависимостей для PHP 8.1+: автовайринг, атрибуты (#[AsService], #[Autowire], #[Inject], декораторы, алиасы), компиляция контейнера в PHP-код, контекстные привязки, теги, области видимости, ленивые сервисы и профилирование.
Package info
pkg:composer/cloud-castle/di
Requires
- php: >=8.1
- psr/container: ^2.0
Requires (Dev)
- deptrac/deptrac: ^3.0 || ^4.0
- ergebnis/composer-normalize: ^2.45
- friendsofphp/php-cs-fixer: ^3.75
- icanhazstring/composer-unused: ^0.9
- illuminate/container: ^10.0 || ^11.0
- infection/infection: ^0.29 || ^0.33
- league/container: ^4.2
- php-di/php-di: ^7.0
- php-parallel-lint/php-parallel-lint: ^1.4
- phpmd/phpmd: ^2.15
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^1.12 || ^2.1
- phpstan/phpstan-deprecation-rules: ^1.2 || ^2.0
- phpstan/phpstan-phpunit: ^1.4 || ^2.0
- phpstan/phpstan-strict-rules: ^1.6 || ^2.0
- phpunit/phpunit: ^10.5 || ^11.5
- pimple/pimple: ^3.5
- psalm/plugin-phpunit: ^0.19 || ^0.20
- rector/rector: ^1.2 || ^2.0
- roave/security-advisories: dev-latest
- squizlabs/php_codesniffer: ^3.12 || ^4.0
- vimeo/psalm: ^6.0
- webmozart/assert: ^1.11
Provides
README
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano
CloudCastle Di
PSR-11 контейнер внедрения зависимостей для PHP 8.1+: автовайринг, контекстные привязки, теги, атрибуты, ленивые сервисы, компиляция, скоупы/TTL, пул объектов и профилирование. Нулевые внешние зависимости (кроме
psr/container).
Установка
composer require cloud-castle/di
Требуется PHP 8.1+.
Быстрый старт
<?php
use CloudCastle\DI\Container;
$container = new Container();
// Явные фабрики (как у Pimple), но с типобезопасным разрешением.
$container->set(LoggerInterface::class, fn (): Logger => new Logger('/var/log/app.log'));
// Автовайринг: конструкторы разрешаются по типам без ручной проводки.
$container->enableAutowiring();
$service = $container->make(ReportService::class); // свежий экземпляр
$shared = $container->get(ReportService::class); // разделяемый (singleton)
// Привязка интерфейса к реализации.
$container->bind(CacheInterface::class, RedisCache::class);
// Контекстные привязки: разным потребителям — разные реализации.
$container->when(PhotoController::class)
->needs(FilesystemInterface::class)
->give(S3Filesystem::class);
// Теги и итерация по тегированным сервисам.
$container->tag(JsonReport::class, 'report');
$container->tag(CsvReport::class, 'report');
foreach ($container->getTaggedIterator('report') as $report) {
$report->render();
}
// Заморозка после сборки — защита от мутаций в рантайме.
$container->freeze();
Возможности
- PSR-11 контейнер:
get()/has(), совместим с любым PSR-11 потребителем. - Автовайринг конструкторов, свойств, методов и имён параметров (переключаемо).
- Контекстные привязки
when()->needs()->give()— разным потребителям разные зависимости. - Теги сервисов с приоритетом + итератор/локатор тегированных сервисов.
- Атрибуты
#[...]для регистрации и конфигурации сервисов. - Ленивые сервисы и lazy-ghost прокси (отложенная инициализация).
- Компиляция контейнера для продакшена, скоупы, TTL, пул объектов, профилирование и умный кэш разрешений.
freeze()— иммутабельность контейнера после сборки; обнаружение циклов.
Коротко
Быстрый безфреймворковый DI-контейнер с автовайрингом, контекстными привязками,
тегами, атрибутами, lazy и компиляцией — при единственной runtime-зависимости
psr/container. По функционалу перекрывает объединение аналогов, лидирует по
скорости разрешения и безопасности; по памяти — второй, вплотную за php-di.
Сравнение с аналогами
Все таблицы ниже сгенерированы автоматически из честных сравнительных
тестов (benchmarks/compare.php) на ОДИНАКОВОЙ операции для всех аналогов,
PHP 8.1.34, без Xdebug.
1. Функциональность
| Возможность | 🏆 CloudCastle | php-di | league | illuminate | pimple¹ | new¹ |
|---|---|---|---|---|---|---|
| Автовайринг конструкторов | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ |
| Контекстные привязки (when/needs/give) | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ |
| Теги сервисов | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ |
| Атрибуты / lazy / компиляция | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Нулевые внешние зависимости (кроме psr/container) | ✅ | ❌ | ✅ | ❌ | ✅ | ✅ |
| Всего | 🏆 5 | 2 | 3 | 3 | 1 | 1 |
2. Безопасность и корректность
| Свойство | 🏆 CloudCastle | php-di | league | illuminate | pimple¹ | new¹ |
|---|---|---|---|---|---|---|
| Обнаружение циклических зависимостей | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
| Заморозка контейнера (freeze) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Контрактные исключения PSR-11 | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
| Изоляция инстансов (нет глобального состояния) | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
| Всего | 🏆 4 | 3 | 2 | 0 | 1 | 1 |
3. Производительность
Разрешение свежего графа A→B→C, 200 000 раз (минимум из 4).
| Решение | Время (мс) | Итог |
|---|---|---|
| new¹ | 1 017 | базовый уровень (не библиотека) |
| pimple¹ | 6 158,6 | базовый уровень (не библиотека) |
| 🏆 CloudCastle | 9 548,1 | быстрейшее среди библиотек |
| php-di | 10 347,4 | аналог |
| league | 41 353,1 | аналог |
| illuminate | 45 586,8 | аналог |
4. Потребление памяти
Фактически занятая память 50 000 удержанных разрешённых графов (изолированный процесс).
| Решение | Пиковая память (KB) | Итог |
|---|---|---|
| 🏆 php-di | 5 409 | легчайшее среди библиотек |
| CloudCastle | 5 483 | аналог |
| pimple¹ | 11 517 | базовый уровень (не библиотека) |
| new¹ | 11 517 | базовый уровень (не библиотека) |
| illuminate | 11 523 | аналог |
| league | 11 610 | аналог |
¹ Базовый уровень (нативные вызовы/примитивы без полноты решения) показан для контекста и не претендует на победу среди библиотек-аналогов.
О памяти честно. Замер — фактически занятая память (
memory_get_usage) при удержании 50 000 разрешённых графов-объектов в изолированном процессе (сgcдо и после, не транзиентный пик). CloudCastle идёт вплотную заphp-di(разница ~1%) и вдвое легчеleague/illuminate. Память — единственная ось, где пакет второй; по скорости, функционалу и безопасности он лидирует.
Плюсы, минусы и когда применять
Сильные стороны:
- Функционал = объединение аналогов — автовайринг + контекстные привязки +
теги + атрибуты/lazy/компиляция при одной runtime-зависимости (
psr/container); ни один аналог не покрывает всё это сразу. - Быстрейшее автоматическое разрешение среди библиотек — быстрее
php-di,leagueиilluminateна разрешении свежего графаA→B→C. - Безопасность — обнаружение циклов, заморозка контейнера (
freeze), контрактные исключения PSR-11, изоляция инстансов без глобального состояния (лидер по безопасности). - Память — вплотную за самым лёгким
php-di, вдвое легчеleague/illuminate.
Слабые стороны (честно):
- Память —
php-diпримерно на 1% легче при удержании графов (в пределах шума); это небольшой компромисс ради скорости и богатства функционала. - Экосистема — у
php-diиilluminateшире набор готовых интеграций и примеров.
Когда применять. Когда нужен быстрый, безопасный автовайринг-контейнер с
контекстными привязками, тегами и атрибутами без привязки к фреймворку — как в
доменных сервисах, так и в собственных микрофреймворках. Для тесной интеграции с
Laravel удобнее illuminate/container.
Разработка
composer install
composer check # линтеры + статический анализ + тесты
composer fix # автоисправления (Rector, PHP CS Fixer, PHPCBF)
composer ci # полный CI-пайплайн локально
Полный список команд с описаниями: composer run-script --list.
Документация
- Wiki (возможности, диаграммы, сравнения): wiki/docs/ru/Home.md
- Жизненный цикл контейнера (mermaid)
- Автовайринг · Контекстные привязки · Теги · Атрибуты · Ленивые сервисы · Компиляция
- Репозиторий: https://gitverse.ru/cloud-castle/di
- История изменений: CHANGELOG.md
- Как внести вклад: CONTRIBUTING.md
- Кодекс поведения: CODE_OF_CONDUCT.md
- Политика безопасности: SECURITY.md
Лицензия
MIT © CloudCastle (alex-4-17@yandex.ru)
🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano