Skip to content

Feature Prototypes

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

🔄 Прототипы — make()

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

make($id) возвращает свежий экземпляр на каждый вызов, минуя singleton-кэш. Прототип-семантика для сервисов с состоянием.

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

В отличие от get(), make() не читает и не пишет resolved: он всегда заново вызывает фабрику или заново autowire-ит класс. Fast-path make() при выключенных opt-in фичах (пул, профилирование) — прямой вызов Closure-фабрики или autowire без лишних проверок, поэтому прототипы в CloudCastle быстрее всех аналогов (см. Производительность).

$c->set(Report::class, fn () => new Report());

$c->make(Report::class) === $c->make(Report::class); // false — каждый раз новый

// autowiring тоже работает через make():
$c->enableAutowiring();
$dto = $c->make(RequestDto::class); // свежий граф зависимостей

Плюсы

  • Свежее состояние: каждый вызов — чистый объект, безопасно для DTO, команд, билдеров.
  • Autowiring на лету: make(FQCN) собирает граф без явной регистрации.
  • Быстрее конкурентов в режиме transient (фабрика/свежий экземпляр).

Минусы

  • Нет кэша — для дорогих в создании объектов каждый make() платит полную цену.
  • Легко перепутать с get(): make() не singleton, состояние между вызовами не сохраняется.

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

  • Использовать make() для объектов «одноразового» назначения: DTO, команды, value-объекты, билдеры запросов.
  • Комбинировать с scope, когда нужен «singleton в пределах запроса, но новый на следующий».

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

  • Звать make() в горячем цикле для дорогого сервиса (клиент БД, HTTP) — используйте singleton get().
  • Ожидать, что изменения объекта из make() увидит другой код, — это разные экземпляры.

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

Контейнер Аналог
PHP-DI make() — тот же смысл (свежий экземпляр с autowiring)
Symfony shared: false в определении сервиса
Laravel make() при bind() (не singleton())
Pimple $c->factory(fn () => …) — помечает как non-shared (⚠️ ограниченно)
Nette false shared / create*() фабрики

Все кроме Pimple имеют полноценные прототипы; Pimple — только через factory().

См. также: Фабрики и singleton · Scoped-сервисы.

Clone this wiki locally