-
-
Notifications
You must be signed in to change notification settings - Fork 1
Feature Auto registration
github-actions[bot] edited this page Jul 8, 2026
·
1 revision
Class-level attribute #[AsService] позволяет классу декларативно объявить свои теги и alias'ы прямо в коде. При сканировании каталога (scan()) контейнер autowire'ит класс и применяет объявленное — без ручной проводки. Аналог #[Autoconfigure] / #[AsTaggedItem] / #[AsAlias] Symfony.
- Помечаете класс attribute
#[AsService(tags: [...], aliases: [...])]. - Вызываете
scan($directory)— для каждого найденного instantiable-класса контейнер:- регистрирует его через
autowire(); - читает
#[AsService]и применяетtag()для каждого тега иalias()для каждого alias.
- регистрирует его через
- Класс, уже определённый вручную (
set()/bind()), при сканировании пропускается — явная конфигурация имеет приоритет.
use CloudCastle\DI\Attribute\AsService;
#[AsService(tags: ['event.listener'], aliases: [HandlerInterface::class])]
final class CreateUserHandler implements HandlerInterface
{
public function __construct(private readonly Mailer $mailer) {}
}
$c = new Container();
$c->scan(__DIR__ . '/src/Handlers'); // autowire + теги + alias из attribute
$c->getTagged('event.listener'); // ['App\CreateUserHandler' => object]
$c->get(HandlerInterface::class); // экземпляр CreateUserHandler (через alias)- Ноль ручной конфигурации: новый обработчик регистрируется и тегируется одним attribute — не нужно править конфиг или service provider.
- Локальность: правила регистрации живут рядом с классом, а не в отдельном файле; при удалении класса «висячих» записей не остаётся.
-
Совместимость:
tags/aliasesложатся на штатныеtag()иalias()— работает со всем tagged-API.
- Применяется только при
scan()— вызовautowire($class)для одного класса attribute не читает (быстрый путь регистрации остаётся без reflection). - Требует reflection на этапе сканирования (это фаза сборки, не рантайма) — не для горячего пути.
- Общий с scan-подходом риск: правила размазаны по классам, единого «реестра» нет (компенсируется
dump()).
- Помечать
#[AsService]реализации, которые собираются по тегу (listeners, handlers, middleware) и/или должны резолвиться по интерфейсу. - Держать сканируемые каталоги узкими (фильтр по namespace), чтобы
scan()не обходил лишнее.
- Дублировать в attribute то, что уже задаёт
autoconfigure()по интерфейсу — выберите один механизм на правило. - Класть в
aliasesid, конфликтующий с другим сервисом, — alias перезапишет цель резолвинга. - Рассчитывать, что
#[AsService]сработает безscan()(например, только приget()).
| Контейнер | Аналог |
|---|---|
| PHP-DI |
#[Injectable] ( |
| Symfony |
#[AsTaggedItem], #[Autoconfigure], #[AsAlias] (эталон) |
| Laravel | нет — регистрация через service providers (❌) |
| Pimple | нет attributes (❌) |
| Nette | регистрация через NEON, не через PHP-attributes (❌) |
CloudCastle, Symfony — теги и alias'ы объявляются class-level attribute'ом.
См. также: Сканирование каталога · Autoconfigure · Теги · Алиасы.
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