web-dev-qa-db-fra.com

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

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"?

25
IAmJulianAcosta

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

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

  • Les contrôleurs renvoient 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 tas 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, mettez simplement la logique de recherche dans votre couche métier (où il appartient en premier lieu, d'ailleurs), 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 de gestion,
  • 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.

27
Arseni Mourzenko