-
-
Notifications
You must be signed in to change notification settings - Fork 1
Feature Lazy
lazy($serviceId) возвращает лёгкую обёртку LazyService, которая создаёт реальный сервис только при первом реальном обращении. Туториал — Prototypes-alias-lazy.
lazy($id) не создаёт сервис, а отдаёт LazyService, держащий ссылку на контейнер и id. Первое обращение к обёрнутому сервису (через её API) триггерит get($id) и делегирует вызов. Полезно, когда зависимость дорогая, но нужна не всегда.
final class Controller
{
public function __construct(private LazyService $report) {}
public function maybe(): void
{
// ReportGenerator создастся только здесь, если ветка выполнится
$this->report->get()->generate();
}
}
$c->set('ctrl', fn (Container $c) => new Controller($c->lazy(ReportGenerator::class)));Для прозрачного прокси, реализующего интерфейс сервиса, см. Lazy ghost proxy.
- Экономия ресурсов: дорогой сервис не создаётся, пока реально не понадобится.
- Помогает разрывать циклы (одна сторона — ленивая).
- Не требует внешних зависимостей (в отличие от ghost-прокси).
- Обёртка не является тем же типом, что сервис (нужно звать
->get()/ API обёртки) — для прозрачности берите lazyGhost. - Лишний уровень косвенности.
- Оборачивать дорогие/редко используемые зависимости (генераторы отчётов, тяжёлые клиенты).
- Использовать для разрыва циклических зависимостей.
- Оборачивать в lazy всё подряд «на всякий случай» — усложняет код без выгоды.
- Прятать за lazy обязательную зависимость, которая нужна всегда.
| Контейнер | Аналог |
|---|---|
| PHP-DI |
\DI\factory() + прокси; lazy — через ocramius/proxy-manager |
| Symfony |
lazy: true (ghost/virtual proxy) |
| Laravel | нет прямого lazy-wrapper ( |
| Pimple | нет (❌) |
| Nette | ленивое создание сервисов ядром |
CloudCastle даёт и лёгкую обёртку lazy(), и ghost-прокси.
См. также: Lazy ghost proxy · Детекция циклов.
CloudCastle DI · · PHP 8.1+ · PSR-11
GitHub · Packagist · Releases · Discussions · Сравнение
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)
- 🏗️ Архитектура
- ⚡ Быстрый старт
- 📊 Сравнение — 5 аналогов, таблица + победители
- 🧩 Возможности (детально) — каждая фича: принцип, +/−, аналоги
- 🧪 Bootstrap
- 🚀 Compiled container
- 🔗 Contextual binding
- 🤖 Autowiring
- 📄 Конфигурация
- 📖 Справочник конфигурации
- 📂 Сканирование классов
- 🌍 Глобальный реестр
- 🏷️ Теги и декораторы
- 🔗 call(), bind(), hooks
- 🔄 Прототипы, alias, lazy, lazyGhost
- 📋 Справочник API
- 🏭 Фабрики и singleton