Skip to content

Feature Aliases

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

🔗 Алиасы

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

alias($alias, $targetId) даёт сервису второе имя. Обращение по алиасу разрешается в целевой id.

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

Алиасы хранятся в ленивом ServiceAliasResolver. Пока не зарегистрирован ни один алиас, резолвер не создаётся и hot path (get / make / has) его вообще не вызывает (гейт hasAliases) — нулевая цена, если алиасы не используются. При наличии алиасов резолвер разворачивает цепочку (a → b → c) с защитой от циклов.

$c->set(FileLogger::class, fn () => new FileLogger());
$c->alias(LoggerInterface::class, FileLogger::class);
$c->alias('log', LoggerInterface::class); // цепочка

$c->get('log'); // FileLogger — через log → LoggerInterface → FileLogger

Плюсы

  • Развязка имён: код зависит от LoggerInterface::class, а конкретная реализация меняется одним алиасом.
  • Нулевой overhead, если алиасы не используются (ленивый резолвер + гейт).
  • Защита от циклических алиасов.

Минусы

  • Слишком длинные цепочки алиасов усложняют отладку — держите их короткими.
  • Алиас — это не bind(): он указывает на зарегистрированный id, а не привязывает интерфейс к автоувязываемому классу.

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

  • Алиасить интерфейс на реализацию: alias(LoggerInterface::class, FileLogger::class).
  • Использовать для переключения окружений (prod/test реализация одного контракта).

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

  • Плодить длинные цепочки a → b → c → d ради «красоты» — это runtime-разыменование на каждом обращении.
  • Использовать алиас там, где нужен autowiring интерфейса — берите bind().

Alias атрибутом (#[AsAlias])

При сканировании каталога класс с #[AsAlias('id')] автоматически получает alias — без ручного alias() (аналог Symfony #[AsAlias]). Attribute повторяемый — несколько alias'ов на класс:

#[AsAlias(LoggerInterface::class)]
#[AsAlias('log')]
final class FileLogger implements LoggerInterface {}
// get(LoggerInterface::class) и get('log') → FileLogger

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

Контейнер Аналог
PHP-DI get(X::class) через autowire()->… / \DI\get('alias')
Symfony alias: в конфиге сервисов
Laravel alias() в контейнере
Pimple нет нативно (⚠️ — вручную второй ключ)
Nette alias в NEON

Все кроме Pimple имеют алиасы.

См. также: bind() · Contextual binding.

Clone this wiki locally