Есть ли хороший способ уменьшить количество параметров (зависимостей), передаваемых контроллеру?

Итак, в Silex я пытаюсь получить параметр $app из своих действий контроллера и просто передать зависимости, относящиеся к контроллеру/действию.

Обычно мои контроллеры имеют следующие общие зависимости:

  • Механизм шаблонов
  • Провайдер сеанса
  • Поставщик услуг перевода
  • Генератор URL
  • Поставщик проверки

У меня есть базовый класс контроллера, который по умолчанию принимает их в конструкторе. Контроллеры, унаследованные от него, также получают эти параметры. Кроме того, они принимают другие параметры, такие как репозиторий/хранилище объектов (например, пользовательский репозиторий в аутентификации или пользовательском контроллере).

В итоге я регистрирую контроллеры в Silex с минимум 5 параметрами для конструктора, когда кажется, что я не вижу многого из этого в других приложениях. Такое ощущение, что я делаю это неправильно.

Я также понимаю, что жалуюсь на то же самое, что и контейнер Pimple DI «исправляет», но его использование также кажется не совсем верным для философии DI.

Мой вопрос: есть ли лучший способ сделать то, что я делаю?


person Moismyname    schedule 14.03.2014    source источник
comment
Связано: stackoverflow.com/a/2420245/126014   -  person Mark Seemann    schedule 21.03.2014


Ответы (1)


Да, есть альтернативные решения.

  • Первый — «группировать» ваши параметры в новые классы, такие как ControllerUtil или что-то в этом роде. Это не всегда легко или возможно, так что я не особый поклонник этого.

Бенджамин Эберлей объясняет этот подход в этом сообщении в блоге: Расширение Symfony2: Controller Utilities

  • Во-вторых, использовать альтернативу внедрению конструктора, например, внедрение свойств или сеттеров. Это не так чисто, как внедрение конструктора, но чрезвычайно практично.

Данные контроллеры, как правило, не являются теми компонентами, которые вы хотите повторно вводить, повторно использовать или тестировать, так что это приемлемый компромисс IMO. Я использую этот метод около года, и я не могу вернуться.

Вот соответствующее сообщение в блоге, которое я написал на эту тему: Контроллеры как службы?

person Matthieu Napoli    schedule 17.03.2014