-
-
Notifications
You must be signed in to change notification settings - Fork 1
Feature Scoped
Scoped-сервис — singleton в пределах scope и transient вне его. Один экземпляр на запрос/задачу, новый — на следующую. Туториал — Scopes.
scoped($id, $concrete) регистрирует сервис как scope-зависимый. beginScope() открывает область (вложенные — стеком, LIFO), endScope() закрывает и сбрасывает созданные в ней scoped-экземпляры. Внутри активного scope get($id) возвращает один и тот же экземпляр; вне scope или в новом scope — создаётся заново. inScope(), isScoped(), scopeDepth() — интроспекция. Реализация (ContainerScopeSupport) не влияет на обычный singleton-кэш и гейтится флагом hasScoped (нулевая цена, если scoped не используются).
$c->scoped(RequestContext::class, fn () => new RequestContext());
$c->beginScope();
$a = $c->get(RequestContext::class);
$b = $c->get(RequestContext::class);
$a === $b; // true — один на scope
$c->endScope();
$c->beginScope();
$c2 = $c->get(RequestContext::class);
$c2 === $a; // false — новый scope, новый экземпляр
$c->endScope();- Изоляция состояния запроса/задачи в долгоживущих процессах (worker, Swoole, RoadRunner): один контекст на итерацию, без утечек между запросами.
- Вложенные scope-ы (LIFO) для под-задач.
- Нулевой overhead, если scoped-сервисы не заведены.
- Нужно дисциплинированно парой
beginScope()/endScope()обрамлять единицу работы. - Забытый
endScope()= удержание состояния между итерациями (утечка).
- Оборачивать обработку каждого запроса/сообщения в
beginScope()…endScope()(желательно черезtry/finally). - Хранить в scoped-сервисах контекст запроса (текущий пользователь, correlation-id), а не в глобальных singleton.
- Держать состояние запроса в обычном singleton в долгоживущем процессе — утечёт в следующий запрос (безопасность!).
- Открывать scope и не закрывать его в
finallyпри исключении.
| Контейнер | Аналог |
|---|---|
| PHP-DI | scope устарел/ограничен ( |
| Symfony | request scope / kernel.reset (эталон в fullstack) |
| Laravel |
scoped() binding (per-request в Octane) |
| Pimple | нет (❌) |
| Nette | ограниченно ( |
CloudCastle, Symfony, Laravel — полноценные scoped-сервисы.
См. также: Scopes (гайд) · Прототипы.
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