-
-
Notifications
You must be signed in to change notification settings - Fork 1
Feature Aliases
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().
При сканировании каталога класс с #[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.
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