В рамках программы экспериментальных функций в Symfony 3.3 выкатили новую фичу, getter injection. Это дополнительный функционал используемый для инъекций зависимостей, стандартные механизмы никуда не делись.

Новый функционал позволяет делать инъекции как и при стандартном подходе, через описание в yml, но при этом мы сразу получаем готовый getter класс.

services:
  SessionListener:
    getters:
      getSession: '@session'

На практике это сообщает DI контейнеру команду на создание анонимного наследованного прокси класса, типа такого:


$sessionListener = new class ($container) extends SessionListener {
    private $container;

    function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    public function getSession()
    {
        return $this->container->get('session');
    }
};

Плюсы использования:

  • Инъекции зависимостей неизменны

  • Для получения зависимости всегда используется геттер

  • Конструктор становится чище, меньше аргументов, проще для понимания

  • Чем-то напоминает использование трейтов, каждая зависимость в своём геттере

  • Зависимости становятся явными

  • Позволяет объявить обязательные зависимостей, используя абстрактные методы для их получения

  • Позволяет иметь дополнительные зависимости представленные ввиде геттеров, от которых мы ожидаем результатом или null, или реализацию по умолчанию

  • Можно удобнее реализовать обработку потери зависимостей и выбрасывать исключения если что не так

  • Прокси легко писать или генерировать

  • Использование геттер инъекций не бьёт по производительности

  • При использовании ананимных или сгенерированных прокси-классов он не создаёт новых типов, меньше проблем с наследованием в итоге