Skip to content

Feature Reset

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

♻️ Reset stateful-сервисов

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

reset() сбрасывает накопленное состояние сервисов между запросами — для долгоживущих процессов (RoadRunner / Swoole / очереди), где контейнер переиспользуется. Аналог Symfony ResetInterface / kernel.reset.

Принцип работы

Сервис, накапливающий состояние, реализует CloudCastle\DI\Contract\ResetInterface с методом reset(): void. Вызов Container::reset() проходит по всем созданным singleton'ам и вызывает reset() у тех, кто реализует контракт. Определения и singleton-кэш сохраняются — сбрасывается только состояние сервисов (не пересоздание).

use CloudCastle\DI\Contract\ResetInterface;

final class RequestContext implements ResetInterface
{
    private array $data = [];
    public function reset(): void { $this->data = []; }
}

// в воркере после каждого запроса:
$container->reset(); // RequestContext::reset() вызван, экземпляр тот же

Плюсы

  • Без утечек состояния между запросами в long-running воркерах — тот же контейнер, чистые сервисы.
  • Экземпляры не пересоздаются: сброс дешевле полного rebuild.
  • Работает и в compiled-контейнере.

Минусы

  • Сервис сам отвечает за корректный reset() — забытое поле остаётся «грязным».
  • Не сбрасывает сервисы, не реализующие контракт (осознанный выбор — только stateful).

✅ Рекомендуется

  • Реализовывать ResetInterface в сервисах с per-request состоянием (контекст запроса, буферы, кэши уровня запроса).
  • Вызывать reset() в мидлваре/воркере на границе запроса.

❌ Антипаттерны

  • Держать per-request состояние в singleton без reset() — источник утечек между запросами.
  • Использовать reset() как замену корректному жизненному циклу scoped-сервисов (Scoped).

Аналоги в других контейнерах

Контейнер Аналог
PHP-DI нет (❌)
Symfony ResetInterface + services_resetter (эталон)
Laravel частично через события/flush (⚠️)
Pimple нет (❌)
Nette нет (❌)

CloudCastle и Symfony дают контракт сброса состояния для long-running процессов.

См. также: Scoped-сервисы · Compiled container.

Clone this wiki locally