-
-
Notifications
You must be signed in to change notification settings - Fork 1
Home
Lightweight PSR-11 dependency injection container for PHP 8.3+ — autowiring, declarative configuration (PHP/JSON/YAML/XML), directory scan, custom inject attributes, tagged services, decorators, call() / bind(), prototypes, lazy, freeze().
Лёгкий контейнер внедрения зависимостей для PHP 8.3+ с поддержкой PSR-11. Одна runtime-зависимость — psr/container. Альтернатива PHP-DI / Symfony DI для micro-apps и composition root.
Текущая версия: 1.6.x — см. Releases · Packagist
composer require cloudcastle/di:^1.6Packagist: https://packagist.org/packages/cloudcastle/di
| CloudCastle DI | |
|---|---|
| Плюсы |
psr/container, PSR-11, autowiring, конфиг из файлов, теги, CI с benchmark-check |
| Минусы | нет compiler/contextual (v2), PHP 8.3+ |
Пошагово vs PHP-DI, Symfony, Pimple, Laravel — Comparison.
- готовые экземпляры и фабрики через
set(); - singleton-кэш: фабрика вызывается один раз до следующего
set(); - PSR-11:
get(),has(); - расширенный контракт:
hasDefinition(),addDefinitions().
-
enableAutowiring()— любой instantiable-класс доступен по FQCN черезget(); -
autowire(FQCN)— точечная регистрация без глобального режима; -
enableParameterNameAutowiring()— id сервиса = имя параметра ($logger→'logger'); -
enablePropertyAutowiring()/enableMethodAutowiring()— typed properties и inject-методы после конструктора; - PHP attributes
Inject/Autowireна конструкторе, свойствах и методах; -
registerAttribute()— пользовательские attributes с контрактомServiceIdAttribute; - разрешение зависимостей: типы, union, intersection, nullable,
ContainerInterface/ PSR-11; - обнаружение циклических зависимостей при autowiring;
- явный
set()всегда имеет приоритет над autowiring.
-
scan($directory, $namespace?)— рекурсивный обход.php-файлов; - парсинг
namespace, несколькихclassиenumбез выполнения файла; - фильтр по префиксу namespace;
- только instantiable-классы (
enumпропускаются); существующиеset()не перезаписываются.
-
make($id)— новый экземпляр без singleton-кэша; -
alias($alias, $targetId)— альтернативный id (цепочки, детекция циклов); -
lazy($serviceId)—LazyServiceс отложеннымget().
-
call($callable, $parameters?)— autowiring параметров callable (CallableInvoker); -
bind($abstract, $concrete)— интерфейс → класс (autowire+alias) или id; -
afterResolving($id, $callback)— пост-обработка после нового resolve (AfterResolvingDispatcher).
-
tag()/getTagged()— группы сервисов (порядок = порядокtag()); -
getTaggedIds()— только id, без создания экземпляров; -
getTaggedIterator()— итерация значений (TaggedServiceIterator); -
getTaggedLocator()—has/getпо id в теге (TaggedServiceLocator); -
decorate()— цепочка обёрток приget()/make()(первый декоратор ближе к inner).
-
ContainerConfigurator— необязательный сервис: PHP (по умолчанию), JSON, YAML, XML; - несколько источников на один контейнер, слияние с приоритетами;
- секции:
services,bind,aliases,autowire,tags,scan,register_attributes,autowiring.
-
freeze()/isFrozen()— блокировка изменений после bootstrap; -
getDefinitionIds(),dump()— отладка wiring.
-
ContainerRegistry— singleton-контейнер приложения; - инициализация в bootstrap через
ContainerRegistry::set(); -
reset()для изоляции тестов.
PHPStan max, Psalm L1, покрытие строк ≥95% (фактически ~98%), Infection MSI ≥95% (весь src/), 470 PHPUnit-тестов, benchmark-check в CI.
flowchart TB
subgraph api [Публичный API]
get[get / make]
apiCall[call]
reg[set / bind / autowire / scan]
cfg[ContainerConfigurator]
attr[registerAttribute]
frz[freeze / dump]
tag[getTagged / Iterator / Locator]
end
subgraph core [Ядро]
aliasR[ServiceAliasResolver]
instR[ServiceInstanceResolver]
hooks[AfterResolvingDispatcher]
invoker[CallableInvoker]
aw[Autowirer + MemberResolver]
attrR[AttributeServiceIdRegistry]
end
subgraph external [Вне контейнера]
cr[ContainerRegistry]
end
reg --> instR
cfg --> reg
attr --> attrR
attrR --> aw
get --> aliasR --> instR
instR -->|новый resolve| hooks
apiCall --> invoker --> aw
instR -->|autowire| aw
aw -->|get зависимостей| get
tag --> get
frz -.->|блокирует мутации| reg
reg -.->|ContainerRegistry::set| cr
Подробные схемы всех потоков — на странице Архитектура.
<?php
use CloudCastle\DI\Container;
use CloudCastle\DI\ContainerRegistry;
$container = new Container();
$container->enableAutowiring();
$container->scan(__DIR__ . '/App/Services', 'App\\Services\\');
$container->bind(LoggerInterface::class, FileLogger::class);
ContainerRegistry::set($container);
$service = ContainerRegistry::get()->get(App\Services\OrderService::class);| Страница | Описание |
|---|---|
| Архитектура | схемы контейнера, autowiring, call, afterResolving, теги |
| Быстрый старт | установка, PSR-11, composition root |
| Сравнение с PHP-DI, Symfony, Pimple | пошаговые таблицы, плюсы/минусы, миграция |
| Примеры bootstrap | plain PHP, CLI, unit/integration тесты |
| Autowiring | reflection, типы параметров, циклы, приоритеты, registerAttribute |
| Конфигурация из файлов | ContainerConfigurator, PHP/JSON/YAML/XML, приоритеты |
| Сканирование классов |
scan(), фильтр namespace, ограничения |
| Глобальный реестр |
ContainerRegistry, bootstrap, тесты |
| Теги и декораторы |
tag(), getTagged(), iterator, locator |
| call(), bind(), afterResolving | v1.3: call, bind, addDefinitions, hooks |
| Прототипы, alias и lazy |
make(), alias(), lazy()
|
| Справочник API | все методы и исключения |
| Фабрики и singleton | callable, кэш, null, циклы в фабриках |
| Тестирование | unit/integration, моки, ContainerRegistry::reset()
|
| Тесты безопасности | 17 тестов: кэш, autowire, id, NotFound |
| Нагрузка и производительность | 15 load + 12 performance, пороги, бенчмарки |
| Анти-паттерны | service locator, autowiring, глобальный контейнер |
| Обновление версий | миграция между релизами |
| Участие в разработке |
composer ci, PR |
| FAQ | частые вопросы |
MIT — см. LICENSE.
CloudCastle DI · Репозиторий · Packagist · Releases · Discussions · Issues
Исходники Wiki — wiki/ в репозитории (синхронизация через Actions).
- Архитектура
- Быстрый старт
- Сравнение с PHP-DI, Symfony, Pimple — пошагово
- Примеры bootstrap
- Autowiring
- Конфигурация из файлов
- Сканирование классов
- Глобальный реестр
- Теги и декораторы
- call(), bind(), afterResolving
- Прототипы, alias и lazy
- Справочник API
- Фабрики и singleton
- Тестирование
- Тесты безопасности
- Нагрузка и производительность
- Анти-паттерны