-
-
Notifications
You must be signed in to change notification settings - Fork 1
Feature Attribute autowiring
Разметка инъекции через PHP-атрибуты (#[Inject] и собственные). Декларативно указываете, что и как внедрять, прямо в коде класса.
Контейнер держит AttributeServiceIdRegistry — реестр атрибутов, помечающих точки инъекции. Встроенный #[Inject] работает «из коробки»; registerAttribute($attributeClass) добавляет свой атрибут. При autowiring инжекторы (PropertyInjector / MethodInjector) находят помеченные атрибутом члены и разрешают их зависимости (по типу или по явному id из атрибута).
use CloudCastle\DI\Attribute\Inject;
final class Mailer
{
public function __construct(
#[Inject(SmtpTransport::class)] private Transport $transport,
) {}
}
// свой атрибут-маркер:
#[Attribute(Attribute::TARGET_PARAMETER | Attribute::TARGET_PROPERTY)]
final class FromConfig {}
$c->registerAttribute(FromConfig::class);- Локальность: правило инъекции живёт рядом с зависимостью, а не в отдельном конфиге.
-
Свои атрибуты — можно выразить доменные правила (
#[FromConfig],#[Tagged]). - Явный id в атрибуте снимает неоднозначность, когда типа недостаточно.
- Привязывает класс к атрибутам контейнера (небольшая связанность с инфраструктурой).
- Разметка «размазана» по классам — общий обзор графа сложнее, чем в едином конфиге.
- Использовать
#[Inject(Id::class)]там, где по типу неоднозначно (несколько реализаций интерфейса). - Регистрировать доменные атрибуты через
registerAttribute()для читаемых правил.
- Дублировать атрибутами то, что и так решает constructor autowiring по типу, — лишний шум.
- Прятать за атрибутами скалярную конфигурацию, которую честнее задать явно в фабрике/contextual.
| Контейнер | Аналог |
|---|---|
| PHP-DI |
#[Inject]; свои атрибуты — ограниченно ( |
| Symfony |
#[Autowire], #[Target], #[TaggedIterator]
|
| Laravel | атрибуты contextual (#[Give]) — частично |
| Pimple | нет (❌) |
| Nette |
@inject / атрибуты |
CloudCastle, Symfony, Laravel, Nette — включая пользовательские inject-атрибуты (CloudCastle — полноценно).
См. также: Property и method injection · 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