Skip to content

Feature Lazy

github-actions[bot] edited this page Jul 8, 2026 · 1 revision

💤 Lazy service

← Возможности · Главная · Сравнение

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 · Детекция циклов.

Clone this wiki locally