Skip to content
github-actions[bot] edited this page Jun 27, 2026 · 1 revision

CloudCastle DI

CloudCastle DI

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.6

Packagist: 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().

Autowiring

  • 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() не перезаписываются.

Прототипы, alias и lazy (v1.2)

  • make($id) — новый экземпляр без singleton-кэша;
  • alias($alias, $targetId) — альтернативный id (цепочки, детекция циклов);
  • lazy($serviceId)LazyService с отложенным get().

call(), bind(), afterResolving (v1.3)

  • call($callable, $parameters?) — autowiring параметров callable (CallableInvoker);
  • bind($abstract, $concrete) — интерфейс → класс (autowire + alias) или id;
  • afterResolving($id, $callback) — пост-обработка после нового resolve (AfterResolvingDispatcher).

Tagged services и декораторы

  • tag() / getTagged() — группы сервисов (порядок = порядок tag());
  • getTaggedIds() — только id, без создания экземпляров;
  • getTaggedIterator() — итерация значений (TaggedServiceIterator);
  • getTaggedLocator()has / get по id в теге (TaggedServiceLocator);
  • decorate() — цепочка обёрток при get() / make() (первый декоратор ближе к inner).

Конфигурация из файлов (v1.5)

  • ContainerConfigurator — необязательный сервис: PHP (по умолчанию), JSON, YAML, XML;
  • несколько источников на один контейнер, слияние с приоритетами;
  • секции: services, bind, aliases, autowire, tags, scan, register_attributes, autowiring.

Заморозка и интроспекция (v1.4)

  • 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
Loading

Подробные схемы всех потоков — на странице Архитектура.

Минимальный пример

<?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.

Clone this wiki locally