-
-
Notifications
You must be signed in to change notification settings - Fork 1
Feature Property method injection
github-actions[bot] edited this page Jul 8, 2026
·
1 revision
Помимо конструктора, контейнер умеет инъектировать зависимости в типизированные свойства и вызывать сеттеры/методы с автоувязкой аргументов.
-
enablePropertyAutowiring()— после создания объектаPropertyInjectorпроходит по свойствам, помеченным на инъекцию (по типу / атрибуту), и присваивает разрешённые из контейнера зависимости. -
enableMethodAutowiring()—MethodInjectorвызывает подходящие методы (например, помеченные атрибутом), разрешая их параметры из контейнера. Статические методы, конструктор, методы без параметров и__-методы отфильтровываются.
final class Controller
{
#[Inject]
private LoggerInterface $log; // property injection
#[Inject]
public function setDb(Db $db): void // method injection
{
$this->db = $db;
}
}
$c->enableAutowiring();
$c->enablePropertyAutowiring();
$c->enableMethodAutowiring();
$ctrl = $c->get(Controller::class);- Способ внедрить зависимость там, где конструктор нежелателен (наследование фреймворк-классов, опциональные зависимости).
- Гибко: инъекция по типу или по атрибутам.
- Скрытые зависимости: по сигнатуре конструктора не видно, что нужно объекту, — усложняет тестирование.
- Property injection ломает иммутабельность и
readonly. - Дороже конструкторной инъекции (доп. проход рефлексии).
- Предпочитать constructor injection. Property/method — только когда конструктор недоступен (базовые классы фреймворков, циклические UI-графы).
- Явно помечать инъектируемые члены атрибутом — не полагаться на «инъекцию всего по типу».
- Массовая property injection вместо конструктора «чтобы короче» — это Service-Locator наизнанку и антипаттерн тестируемости. См. Анти-паттерны.
- Инъекция в
publicизменяемые свойства, которые потом переопределяются кодом.
| Контейнер | Аналог |
|---|---|
| PHP-DI |
#[Inject] на свойстве/методе |
| Symfony |
@required метод, property injection через атрибуты |
| Laravel | method injection в контроллерах; property — нет нативно |
| Pimple | нет (❌) |
| Nette | inject-методы / @inject свойства |
Все кроме Pimple.
См. также: Attribute autowiring · Constructor autowiring.
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