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

FAQ

Чем CloudCastle DI отличается от PHP-DI / Symfony / Pimple?

Пошаговое сравнение с таблицами по каждому критерию — Comparison.

Кратко: компактный PSR-11 контейнер (psr/container), autowiring, scan(), теги — без YAML и compiled container. Нет contextual binding (v2); для него сейчас PHP-DI или Symfony DI.

Есть autowiring?

Да. Включите глобально:

$container->enableAutowiring();
$service = $container->get(App\Service\MyService::class);

Или точечно: $container->autowire(App\Service\MyService::class).

Подробнее — Autowiring.

Можно ли конфигурировать контейнер из YAML/JSON?

Да (v1.5.0) — через ContainerConfigurator: PHP (по умолчанию), JSON, YAML (ext-yaml), XML. Несколько файлов с приоритетами. Конфигурация необязательна. См. Configuration.

Можно ли использовать свои PHP attributes для inject?

Да — реализуйте ServiceIdAttribute и вызовите registerAttribute(). См. Autowiring.

Можно использовать id = FQCN класса?

Да. При autowiring id — полное имя класса. Можно также использовать произвольные строки ('logger', 'mailer') через set().

Как зарегистрировать все классы в каталоге?

$container->scan(__DIR__ . '/Services', 'App\\Services\\');

См. Сканирование классов.

Есть глобальный контейнер?

ДаContainerRegistry::set() / get(). Рекомендуется инициализировать в bootstrap; в тестах вызывайте ContainerRegistry::reset(). См. Глобальный реестр.

Поддерживаются tagged services и декораторы?

Да: tag() / getTagged() и decorate(). С v1.3.0 также getTaggedIds(), getTaggedIterator(), getTaggedLocator(). См. Теги и декораторы.

Есть call(), bind() и afterResolving?

Да (с v1.3.0):

  • call($callable, $parameters?) — autowiring параметров при вызове функции/метода (CallableInvoker)
  • bind($abstract, $concrete)autowire + alias для класса или только alias для id
  • addDefinitions(array) — массовый set()
  • afterResolving($id, $callback) — callback после нового создания (не из singleton-кэша)

См. call(), bind(), afterResolving.

Есть прототипы, alias и lazy?

Да (с v1.2.0):

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

См. Прототипы, alias и lazy.

Поддерживаются PHP attributes?

Да. CloudCastle\DI\Attribute\Inject и Autowire на параметрах конструктора, свойствах, методах и параметрах методов:

#[Inject('app.clock')]
private ClockInterface $clock;

#[Inject]
protected function setClock(ClockInterface $clock): void {}

Подробнее — Autowiring.

Autowiring свойств и методов?

Да.

  • enablePropertyAutowiring() — typed properties без attribute (после конструктора)
  • enableMethodAutowiring() — public/protected setter и inject-методы с параметрами
  • Attributes #[Inject] / #[Autowire] на свойствах и методах работают без этих флагов

Порядок: конструктор → свойства → методы. См. Autowiring.

Поддерживаются intersection-типы?

Да. Параметры вида Iterator&Countable разрешаются, если экземпляр из контейнера удовлетворяет всем типам intersection.

Autowiring по имени параметра?

Да, опционально: enableParameterNameAutowiring(). Параметр $logger получит сервис с id 'logger', если он зарегистрирован. По умолчанию выключено.

Обнаруживаются циклические зависимости?

При autowiring — да (ContainerException). В фабриках set() — нет, возможен бесконечный цикл.

Потокобезопасность?

Container не синхронизирован. В PHP-FPM один контейнер на запрос — типичный сценарий. В long-running workers при параллельном доступе нужна внешняя синхронизация или контейнер на worker.

Как обновить Packagist после форка?

В upstream настроен workflow Packagist с secret PACKAGIST_TOKEN. Для форка настройте свой токен в Settings → Secrets.

Где API-документация?

composer docs

Результат в docs/ (генерируется локально). Руководство — doc/guide/ и эта Wiki. Схемы архитектурыАрхитектура.

Куда задавать вопросы?

Clone this wiki locally