Lightweight PSR-11 dependency injection container for PHP 8.3+. Autowiring, directory scan, tagged services, decorators. Лёгкий DI-контейнер с autowiring и scan, одна зависимость psr/container.
Requires
- php: ^8.3
- 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
- infection/infection: ^0.29 || ^0.33
- php-parallel-lint/php-parallel-lint: ^1.4
- phpdocumentor/shim: ^3.7
- phpmd/phpmd: ^2.15
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^2.1
- phpstan/phpstan-deprecation-rules: ^2.0
- phpstan/phpstan-phpunit: ^2.0
- phpstan/phpstan-strict-rules: ^2.0
- phpunit/phpunit: ^11.5
- psalm/plugin-phpunit: ^0.19
- rector/rector: ^2.0
- roave/security-advisories: dev-latest
- squizlabs/php_codesniffer: ^3.12 || ^4.0
- vimeo/psalm: ^6.0
This package is auto-updated.
Last update: 2026-06-26 00:02:35 UTC
README
English: Lightweight PSR-11 dependency injection container for PHP 8.3+. Explicit set() / get() wiring, optional constructor/property/method autowiring, directory scan, tagged services, decorators, global registry — one runtime dependency (psr/container).
Русский: Лёгкий контейнер внедрения зависимостей для PHP 8.3+ с поддержкой PSR-11. Явная регистрация сервисов, singleton-фабрики, autowiring конструктора, свойств и методов, сканирование каталогов, теги, декораторы и глобальный реестр.
Когда выбрать CloudCastle DI
| CloudCastle DI | PHP-DI | Symfony DI | Pimple | |
|---|---|---|---|---|
| PSR-11 | ✓ | ✓ | ✓ | частично |
| Autowiring (reflection) | ✓ | ✓ | ✓ | — |
| PHP attributes / by-name / intersection / property / method | ✓ | ✓ | ✓ | — |
Явный set() API |
✓ | ✓ | ✓ | ✓ |
| Сканирование каталогов | ✓ | ✓ | ✓ | — |
| Tagged services / decorators | ✓ | ✓ | ✓ | — |
| Минимум зависимостей | ✓ (psr/container) |
больше | фреймворк | ✓ |
| Подходит для micro-library / bootstrap | ✓ | ✓ | избыточен | ✓ |
Подходит, когда нужен компактный контейнер для composition root, тестов или небольшого приложения — с явным wiring и опциональной автоматикой без YAML и compiled container.
Возможности
Базовый DI
- Регистрация сервисов как готовых экземпляров или фабрик
- Singleton-поведение: фабрика вызывается один раз, результат кэшируется
- Передача контейнера в фабрику для разрешения зависимостей
- Соответствие PSR-11 (
Psr\Container\ContainerInterface)
Autowiring и сканирование
Порядок внедрения при autowiring: конструктор → свойства → методы.
enableAutowiring()— создание классов по FQCN приget()без явногоset()autowire(string $className)— точечная регистрация класса (id = полное имя класса)enableParameterNameAutowiring()— параметр$logger→ сервис с id'logger'(по умолчанию выключен)enablePropertyAutowiring()/enableMethodAutowiring()— typed properties и inject-методы/setter после конструктораscan(string $directory, ?string $namespace = null)— обход каталога и autowiring найденных instantiable-классов- PHP attributes
Inject/Autowireна конструкторе, свойствах и методах (attributes работают без флагов property/method) - Разрешение по типам: union, intersection, nullable,
ContainerInterface/ PSR-11 - Обнаружение циклических зависимостей при autowiring
- Явный
set()всегда имеет приоритет над autowiring
Расширения контракта
tag()/getTagged()— групповое получение сервисовdecorate()— цепочка декораторов приget()hasDefinition()— проверка регистрации без создания экземпляра
Глобальный реестр
ContainerRegistry::set()/get()/has()/reset()— singleton-контейнер приложения (инициализация в точке входа,reset()для тестов)
Качество
- Строгая типизация, PHPStan max, Psalm level 1, покрытие строк ≥95%, Infection MSI ≥95%
- CI: PHP 8.3, 8.4, 8.5
Требования
- PHP ^8.3
psr/container^2.0
Установка
composer require cloudcastle/di:^1.1
Быстрый старт
Явная регистрация
<?php use CloudCastle\DI\Container; $container = new Container(); $container->set('logger', new Psr\Log\NullLogger()); $container->set( 'repository', static fn (Container $c) => new UserRepository($c->get('logger')), ); $logger = $container->get('logger'); $repository = $container->get('repository');
Autowiring конструктора
use CloudCastle\DI\Attribute\Inject; use CloudCastle\DI\Container; $container = new Container(); $container->set('app.clock', $clock); $container->enableAutowiring(); $container->enableParameterNameAutowiring(); // опционально: $logger → id 'logger' // Классы создаются по типам конструктора; id = FQCN // #[Inject('app.clock')] на параметрах — явный id $userService = $container->get(App\Service\UserService::class);
Property и method injection
use CloudCastle\DI\Attribute\Inject; use CloudCastle\DI\Container; $container = new Container(); $container->set(LoggerInterface::class, $logger); $container->enableAutowiring(); $container->enablePropertyAutowiring(); // typed properties без attribute $container->enableMethodAutowiring(); // setter без attribute // #[Inject] на свойстве или inject-методе — без enableProperty/MethodAutowiring $service = $container->get(App\Service\ReportService::class);
Сканирование каталога
$container->scan(__DIR__ . '/Services', 'App\\Services\\'); // Каждый instantiable-класс в каталоге регистрируется через autowire() // Существующие set() не перезаписываются
Глобальный контейнер
use CloudCastle\DI\Container; use CloudCastle\DI\ContainerRegistry; $container = new Container(); $container->enableAutowiring(); ContainerRegistry::set($container); $mailer = ContainerRegistry::get()->get(App\Mailer::class);
API (кратко)
| Метод | Описание |
|---|---|
get(string $id): mixed |
Сервис из кэша, set(), autowiring или NotFoundException |
has(string $id): bool |
Доступен ли сервис (включая autowiring) |
set(string $id, mixed $concrete): void |
Экземпляр или фабрика; сбрасывает singleton-кэш |
hasDefinition(string $id): bool |
Есть set() или autowire() без создания |
tag() / getTagged() |
Группы сервисов по тегам |
decorate() |
Обёртки при get() |
enableAutowiring() / disableAutowiring() / isAutowiringEnabled() |
Глобальный autowiring |
enableParameterNameAutowiring() / disableParameterNameAutowiring() |
Autowiring по имени параметра |
enablePropertyAutowiring() / disablePropertyAutowiring() |
Autowiring typed properties |
enableMethodAutowiring() / disableMethodAutowiring() |
Autowiring inject-методов и setter |
autowire(string $className): void |
Явная регистрация класса |
scan(string $directory, ?string $namespace): void |
Autowiring классов из каталога |
Подробнее — Wiki ( Autowiring · API · Bootstrap ) и doc/guide/ после composer docs.
Сообщество
- GitHub Discussions — вопросы, идеи, примеры
- Issues — баги и задачи
Документация
- Wiki — главная · быстрый старт · autowiring · примеры bootstrap · API
- Исходники Wiki в каталоге
wiki/(внутренние ссылки без суффикса.md) - Поддержка — куда обратиться за помощью
- Руководство для разработчиков — окружение, тесты, CI
- История изменений · Обновление версий
- API-документация:
composer docs→ каталогdocs/
Качество
composer install composer ci
Пайплайн: линтеры, PHPStan (max), Psalm (L1), PHPMD, Deptrac, Rector, unit/integration/security/load/performance-тесты, покрытие строк ≥95%, Infection MSI ≥95%.
Лицензия
Распространяется под лицензией MIT.