Est-ce une bonne pratique d'appeler une fonction de contrôleur à partir d'un autre contrôleur?

23

J'ai un cas où je gère la logique d'une recherche dans un contrôleur et je génère des données basées sur des recherches et je reviens sous forme de statistiques.

Est-ce une bonne pratique d'appeler une fonction de contrôleur à partir d'un autre contrôleur? Ou deux contrôleurs ne devraient jamais «parler»?

IAmJulianAcosta
la source

Réponses:

24

C'est assez étrange, bien que la réponse dépende du langage / framework que vous utilisez, car différents langages / frameworks ont différentes approches de MVC.

En général, vous n'utiliserez pas un contrôleur d'un autre car:

  • Les contrôleurs retournent généralement un résultat d'un type destiné à être utilisé par le framework MVC. Ce résultat contient beaucoup d'informations dont vous, en tant qu'appelant, n'avez pas besoin (comme le nom de la vue), et ne facilite pas toujours l'accès aux informations qui pourraient vous intéresser (dans votre cas, le modèle, si je suppose bien).

  • Les contrôleurs ne sont pas faciles à initialiser à partir du code métier, car ils ont souvent besoin d'une certaine quantité d'informations sur la requête HTTP et le contexte. Toutes ces informations devraient être transmises par le framework MVC.

Plus important encore, si vous avez besoin d'un ensemble de résultats de recherche dans deux contrôleurs, un qui affiche les résultats à l'utilisateur final, un autre qui génère des statistiques, placez simplement la logique de recherche dans votre couche métier (à laquelle elle appartient en premier lieu, soit dit en passant), et gardez vos contrôleurs aussi petits que possible.

Le rôle d'un contrôleur, dans MVC, est d'orchestrer le processus:

  • Obtenez les informations pertinentes de la demande,
  • Déléguer aux valideurs la tâche de valider / assainir l'entrée,
  • Appelez les méthodes pertinentes de la couche métier,
  • Donnez au framework MVC le modèle résultant et la vue.

Le rôle d'un contrôleur n'est pas de gérer la logique métier.

Une fois le code déplacé vers la couche métier, vous pouvez alors fournir une interface de recherche qui peut être réutilisée de manière claire et simple, contrairement à un contrôleur utilisé par un autre.

Arseni Mourzenko
la source
Bonjour, Merci pour votre réponse. En supposant que j'ai déplacé la logique de recherche vers la couche métier, quel est le meilleur endroit pour placer l'interface de recherche? J'utilise Laravel.
IAmJulianAcosta
Malheureusement, je n'ai jamais utilisé Laravel. De plus, j'imagine que la réponse dépendra plus de l'architecture de votre application que du framework.
Arseni Mourzenko
En supposant que vous êtes sous le dossier http exactement à un niveau avec votre projet racine. Vous pouvez créer un dossier nommé contrat ici et tous vos fichiers qui agissent comme une interface que vous pouvez placer ici
Faris Rayhan