Чи є гарною практикою виклик функції контролера від іншого контролера?


23

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

Чи є гарною практикою виклик функції контролера від іншого контролера? Або два контролери ніколи не повинні «розмовляти»?

Відповіді:


24

Це досить дивно, хоча відповідь залежить від мови / рамки, яку ви використовуєте, оскільки різні мови / рамки мають різні підходи MVC.

Як правило, ви не будете використовувати один контролер з іншого, оскільки:

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

  • Контролерам непросто ініціалізувати бізнес-код, оскільки їм часто потрібна деяка кількість інформації про HTTP-запит та контекст. Очікується, що вся ця інформація буде передана у рамках МВК.

Що ще важливіше, якщо вам потрібна купа результатів пошуку в двох контролерах - один, який показує результати кінцевому користувачеві, інший, який генерує статистику, просто покладіть логіку пошуку у ваш бізнес-рівень (там, де він належить в першу чергу, до речі), і тримайте контролери якомога менше.

Роль контролера в MVC полягає в оркеструванні процесу:

  • Отримайте відповідний вклад із запиту,
  • Делегуйте валідаторам завдання перевірити / санітувати вхід,
  • Викличте відповідні методи бізнес-рівня,
  • Надайте структурі MVC отриману модель та вигляд.

Роль контролера - не мати справу з логікою бізнесу.

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


Привіт, дякую за вашу відповідь. Якщо припустити, що я перемістив логіку пошуку на бізнес-рівень, де найкраще розмістити пошуковий інтерфейс? Я використовую Laravel.
IAmJulianAcosta

На жаль, я ніколи не використовував Laravel. Більше того, я думаю, що відповідь буде залежати більше від архітектури вашого додатку, а не від фреймворку.
Арсеній Муренко

Припустимо, що ви знаходитесь в папці http рівно на одному рівні з вашим кореневим проектом. Ви можете створити тут папку з іменем контракту, а всі ваші файли, що виступають як інтерфейс, можна розмістити тут
Faris Rayhan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.