É uma boa prática chamar uma função de Controlador de outro Controlador?

23

Estou tendo um caso em que estou lidando com a lógica de uma pesquisa em um controlador e estou gerando alguns dados com base em pesquisas e retornando como estatísticas.

É uma boa prática chamar uma função de controlador de outro controlador? Ou dois controladores nunca devem 'falar'?

IAmJulianAcosta
fonte

Respostas:

24

Isso é bastante estranho, embora a resposta dependa da linguagem / estrutura usada, pois diferentes linguagens / estruturas têm abordagens diferentes do MVC.

Em geral, você não usará um controlador de outro, pois:

  • Os controladores geralmente retornam o resultado de um tipo destinado a ser usado pela estrutura MVC. Esse resultado contém muitas informações de que você, como chamador, não precisa (como o nome da visualização) e nem sempre facilita o acesso às informações de seu interesse (no seu caso, o modelo, se eu acho certo).

  • Os controladores não são fáceis de inicializar a partir do código comercial, pois geralmente precisam de alguma quantidade de informações sobre a solicitação HTTP e o contexto. Espera-se que todas essas informações sejam transmitidas pela estrutura MVC.

Mais importante, se você precisar de vários resultados de pesquisa em dois controladores - um que mostre os resultados para o usuário final, outro que gere estatísticas, basta colocar a lógica de pesquisa na sua camada de negócios (onde pertence em primeiro lugar, a propósito) e mantenha seus controladores o menor possível.

O papel de um controlador, no MVC, é orquestrar o processo:

  • Obtenha a entrada relevante da solicitação,
  • Delegar aos validadores a tarefa de validar / higienizar a entrada,
  • Chame os métodos relevantes da camada de negócios,
  • Forneça à estrutura MVC o modelo resultante e a visualização.

O papel de um controlador não é lidar com a lógica de negócios.

Depois que o código é movido para a camada de negócios, você pode fornecer uma interface de pesquisa que pode ser reutilizada de maneira clara e direta, diferente de um controlador sendo usado em outro.

Arseni Mourzenko
fonte
Olá, obrigado pela sua resposta. Supondo que mudei a lógica de pesquisa para a camada de negócios, onde é o melhor local para colocar a interface de pesquisa? Estou usando o Laravel.
IAmJulianAcosta
Infelizmente, nunca usei o Laravel. Além disso, imagino que a resposta dependerá mais da arquitetura do seu aplicativo, e não da estrutura.
Arseni Mourzenko
Supondo que você esteja na pasta http exatamente um nível com seu projeto raiz. Você pode criar a pasta contrato chamado aqui e todos os seus arquivos que atuam como interface que você pode colocar aqui
Faris Rayhan