-
-
Notifications
You must be signed in to change notification settings - Fork 1
Global registry
github-actions[bot] edited this page Jun 25, 2026
·
1 revision
CloudCastle\DI\ContainerRegistry — статический singleton-реестр одного контейнера приложения.
| Метод | Описание |
|---|---|
ContainerRegistry::set(ContainerInterface $container): void |
Регистрирует глобальный контейнер |
ContainerRegistry::get(): ContainerInterface |
Возвращает контейнер |
ContainerRegistry::has(): bool |
Был ли вызван set()
|
ContainerRegistry::reset(): void |
Сбрасывает реестр (для тестов) |
<?php
declare(strict_types=1);
use CloudCastle\DI\Container;
use CloudCastle\DI\ContainerRegistry;
require 'vendor/autoload.php';
$container = new Container();
$container->enableAutowiring();
$container->scan(__DIR__ . '/Services', 'App\\Services\\');
$container->set(Psr\Log\LoggerInterface::class, createLogger());
ContainerRegistry::set($container);
// Точка входа
runApplication();Доступ из любого места процесса:
use CloudCastle\DI\ContainerRegistry;
final class SomeController
{
public function handle(): void
{
$orders = ContainerRegistry::get()->get(OrderService::class);
// ...
}
}ContainerRegistry::get();
// ContainerException: Глобальный контейнер не инициализирован. Вызовите ContainerRegistry::set().Проверка без исключения:
if (ContainerRegistry::has()) {
$container = ContainerRegistry::get();
}В каждом тесте (или в tearDown) сбрасывайте реестр, чтобы не утекало состояние между кейсами:
protected function tearDown(): void
{
ContainerRegistry::reset();
parent::tearDown();
}
public function testSomething(): void
{
$container = new Container();
$container->set('clock', new FixedClock());
ContainerRegistry::set($container);
// ...
}Предпочтительнее в unit-тестах передавать Container явно в конструктор — без глобального реестра. Реестр удобен в legacy-коде и точке входа CLI/HTTP.
Каждый вызов set() заменяет предыдущий контейнер. Старые ссылки на старый Container остаются валидными, но ContainerRegistry::get() вернёт новый экземпляр.
| Подход | Когда |
|---|---|
Явная передача ContainerInterface
|
новый код, unit-тесты, библиотеки |
ContainerRegistry |
bootstrap, legacy, procedural entry scripts |
ContainerRegistry::reset() |
PHPUnit tearDown, integration suite |
Подробнее о рисках service locator — Анти-паттерны.