Является ли хорошей практикой вызывать функцию контроллера из другого контроллера?

23

У меня есть случай, когда я обрабатываю логику поиска в одном контроллере, и я генерирую некоторые данные на основе поисков и возвращаю их в виде статистики.

Рекомендуется ли вызывать функцию контроллера из другого контроллера? Или два контроллера никогда не должны разговаривать?

IAmJulianAcosta
источник

Ответы:

24

Это довольно странно, хотя ответ зависит от языка / фреймворка, который вы используете, так как разные языки / фреймворки имеют разные подходы MVC.

В общем случае вы не будете использовать один контроллер из другого, поскольку:

  • Контроллеры обычно возвращают результат типа, предназначенного для использования средой MVC. Этот результат содержит много информации, которая вам, как вызывающей стороне, не нужна (например, имя представления), и не всегда позволяет легко получить информацию, которая может вас заинтересовать (в вашем случае модель, если я правильно угадал).

  • Контроллеры нелегко инициализировать из бизнес-кода, поскольку им часто требуется некоторое количество информации о HTTP-запросе и контексте. Ожидается, что вся эта информация будет передана средой MVC.

Что еще более важно, если вам нужна куча результатов поиска на двух контроллерах - один, который показывает результаты конечному пользователю, другой, который генерирует статистику, просто поместите логику поиска в свой бизнес-уровень (где он принадлежит, во-первых, кстати), и держите ваши контроллеры как можно меньше.

Роль контроллера в MVC состоит в организации процесса:

  • Получить соответствующий вклад из запроса,
  • Делегировать валидаторам задачу проверки / дезинфекции ввода,
  • Назовите соответствующие методы бизнес-уровня,
  • Дайте MVC framework полученную модель и вид.

Роль контроллера не в том, чтобы иметь дело с бизнес-логикой.

После того как код перешел на бизнес-уровень, вы можете предоставить интерфейс поиска, который можно многократно использовать простым и понятным способом, в отличие от одного контроллера, который используется другим.

Арсений Мурзенко
источник
Привет, спасибо за ваш ответ. Предполагая, что я переместил логику поиска на бизнес-уровень, где лучше всего разместить интерфейс поиска? Я использую Laravel.
IAmJulianAcosta
К сожалению, я никогда не использовал Laravel. Более того, я полагаю, что ответ будет зависеть больше от архитектуры вашего приложения, а не от структуры.
Арсений Мурзенко
Предполагая, что вы находитесь в папке http ровно на одном уровне с вашим корневым проектом. Здесь вы можете создать папку с именем contract и все ваши файлы, которые действуют как интерфейс, вы можете разместить здесь
Faris