Skip to content

Feature Property method injection

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

💉 Property и method injection

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

Помимо конструктора, контейнер умеет инъектировать зависимости в типизированные свойства и вызывать сеттеры/методы с автоувязкой аргументов.

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

  • 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.

Clone this wiki locally