¿Es una buena práctica llamar a una función de controlador desde otro controlador?

23

Tengo un caso en el que estoy manejando la lógica de una búsqueda en un controlador y estoy generando algunos datos basados ​​en búsquedas y regresando como estadísticas.

¿Es una buena práctica llamar a una función de controlador desde otro controlador? ¿O dos controladores nunca deberían 'hablar'?

IAmJulianAcosta
fuente

Respuestas:

24

Esto es bastante extraño, aunque la respuesta depende del lenguaje / marco que utilice, ya que los diferentes lenguajes / marcos tienen diferentes enfoques de MVC.

En general, no utilizará un controlador de otro ya que:

  • Los controladores generalmente devuelven un resultado de un tipo destinado a ser utilizado por el marco MVC. Este resultado contiene mucha información que usted, como llamante, no necesita (como el nombre de la vista), y no siempre facilita el acceso a la información que le puede interesar (en su caso, el modelo, si me parece bien).

  • Los controladores no son fáciles de inicializar desde el código comercial, ya que a menudo necesitan cierta cantidad de información sobre la solicitud HTTP y el contexto. Se espera que toda esta información sea transmitida por el marco MVC.

Más importante aún, si necesita un montón de resultados de búsqueda en dos controladores, uno que muestra los resultados al usuario final, otro que genera estadísticas, simplemente coloque la lógica de búsqueda en su capa empresarial (donde pertenece en primer lugar, por cierto), y mantenga sus controladores lo más pequeños posible.

La función de un controlador, en MVC, es organizar el proceso:

  • Obtenga la entrada relevante de la solicitud,
  • Delegar a los validadores la tarea de validar / desinfectar la entrada,
  • Llame a los métodos relevantes de la capa empresarial,
  • Dele al marco MVC el modelo resultante y la vista.

La función de un controlador no es tratar con la lógica empresarial.

Una vez que el código se trasladó a la capa empresarial, puede proporcionar una interfaz de búsqueda que puede ser reutilizable de una manera clara y directa, a diferencia de un controlador que se utiliza desde otro.

Arseni Mourzenko
fuente
Hola, gracias por su respuesta. Suponiendo que moví la lógica de búsqueda a la capa empresarial, ¿cuál es el mejor lugar para colocar la interfaz de búsqueda? Estoy usando Laravel.
IAmJulianAcosta
Lamentablemente, nunca he usado Laravel. Además, imagino que la respuesta dependerá más de la arquitectura de su aplicación, en lugar del marco.
Arseni Mourzenko
Suponiendo que está bajo la carpeta http exactamente un nivel con su proyecto raíz. Puede crear una carpeta llamada contrato aquí y todos sus archivos que actúen como interfaz que puede colocar aquí
Faris Rayhan