Un contrôleur par page ou plusieurs pages dans un contrôleur?

16

Je voulais juste quelques conseils sur la façon de faire des MVC. J'utilise codeigniter et je me demandais s'il valait mieux avoir un contrôleur par page pour un site web ou avoir un contrôleur pour toutes les pages?

Disons que j'ai un site Web simple où vous pouvez visiter la page d'accueil, vous connecter, créer un compte et contacter l'administrateur.

  1. Serait-il préférable d'avoir ces contrôleurs: frontend (index), login, compte, contact OU avoir un contrôleur appelé frontend ou autre avec les actions telles que login, createAccount, contact?

  2. Quand savez-vous s'il vaut mieux utiliser un contrôleur dans une situation?

Rushino
la source
J'ai toujours vécu selon le credo: un contrôleur pour les gouverner tous, et dans les ténèbres les lier. (Pas vraiment, mais j'aime le son. :-)
Peter Rowell

Réponses:

17

Il est préférable d'avoir un contrôleur par unité logique, par exemple AccountController (connexion, enregistrement), PagesController (accueil, contact), Backend -> PagesController (créer, modifier, supprimer), UsersController (créer, modifier, supprimer), etc.

Pères Noël
la source
Comment représenteriez-vous un site Web avec ces domaines: accueil, connexion, compte, contact. Souhaitez-vous utiliser 2 contrôleurs comme votre exemple? si vous allez à localhost / il ouvre le homecontroller, alors si vous allez à localhost / contact, en théorie, ne devrait-il pas aller au contrôleur de contact? et que voulez-vous dire par backend?
Rushino
Cela dépend de la structure des pages et du nombre de pages dont vous disposez. Je ferai HomeController (home, contact) ou PagesController (home, contact OR détails (id)). Par exemple, dans ASP.NET MVC, vous avez HomeController par défaut avec la page d'accueil et à propos.
Santas
J'aime cette méthode. Également un ClientController (ou quel que soit le nom que vous voulez lui donner) pour les actions appelées via Jquery.Ajax qui ne sont spécifiques à aucune partie particulière de votre application. c'est-à-dire réutilisable de n'importe lequel de vos points de vue
Chris
Semble la bonne réponse pour moi. CodeIgniter accepte des sous-répertoires pour les contrôleurs qui permettent de séparer les contrôleurs en zones afin que je puisse me retrouver avec deux pagescontroller (un par zone). Merci!
Rushino
Mais ne vous retrouveriez-vous pas avec des contrôleurs assez gros, même si ses actions sont toutes relatives? Ou est-ce sans problème?
Kid Diamond
4

@Rushino Vous avez deux «applications» ici - le front-end (pour les lecteurs) et le backend (pour les administrateurs). Pour chaque groupe de fonctionnalités, vous avez un contrôleur.

La connexion est un tel groupe, qui comprend la génération du formulaire HTML (les champs, l'appel de la vue), et la gestion du formulaire (la validation, la connexion avec le modèle). La «connexion» est donc un contrôleur avec deux actions - generateForm et handleForm.

Les pages sont divisées entre l'application frontale - qui ne montre que les pages - et l'application backend qui permet de les modifier, les supprimer, les créer et éventuellement les afficher d'une manière différente. La page d'accueil est `` juste une autre page '' sur la face avant au moins, elle s'inscrit donc dans le contrôleur de pages. Sur le backend, sa logique peut être suffisamment différente pour justifier un contrôleur complètement différent.

Pour les utilisateurs - si les utilisateurs peuvent s'enregistrer eux-mêmes, ils auront besoin d'un contrôleur frontal, mais sinon, tout ce qui concerne les utilisateurs va simplement dans le backend.

Notez que chacune des fonctions backend peut nécessiter à la fois un générateur et un gestionnaire. Ces choses peuvent être divisées en fichiers de configuration, cependant, avec un plugin qui est un générateur de formulaire générique.

En résumé, cela ressemble à ceci:

Frontend
  Pages
    View, Handle
  Login
    View, Handle
  Users
    Register (note that the handler can be the same as 'create' on the backend)
  Contact
    View
    Handle

Backend
  Users
    Create, Delete, Edit, Update, View
  Pages
    Create, Delete, Edit, Update, View
Dan souffle
la source
Attendez ... vous dites qu'une section représente une application? façon intéressante de le faire (et probablement LA façon de le faire). Je me demande si codeigniter le fait de cette façon .. vérifiera. Je dois être sûr que vous pouvez passer d'une application à une autre sans interrompre l'état de la session ou de la connexion.
Rushino du
1
@Rushino CodeIgniter peut le faire de cette façon - vous pouvez placer des dossiers dans le répertoire Controllers. La distinction entre «applications» n'est pas au niveau de la base de données / du modèle, mais au niveau du contrôleur / de la vue. La raison de la séparation est que votre backend fait des choses très différentes, souvent avec une conception complètement différente. Cela contribue à la sécurité, car vous pouvez restreindre IP à l'ensemble du répertoire principal. Et cela aide au développement car vous pouvez travailler sur le backend sans affecter le frontend.
Dan Blows
2

Je pense que vous devriez utiliser un contrôleur par unité commerciale, comme OrdersController pour toutes les opérations liées aux commandes et autres. Je suis conscient que dans ce cas, les contrôleurs deviennent ÉNORMES, mais nous pouvons toujours utiliser des classes d'assistance pour déléguer des choses comme l'initialisation du modèle et des classes partielles pour répartir les actions dans des fichiers séparés.

Par exemple, je peux avoir OrdersControllerCreate.cs and OrdersController fichiers List.cs pour la classe OrdersController chacun avec l'ensemble d'actions correspondant. Rend les choses beaucoup plus propres et conserve les opérations de commandes centralisées dans une seule classe de contrôleur.

Juste mes 2 cents.

Luis Aguilar
la source
0

Je pense que vous pourriez adopter une approche différente:

Un contrôleur principal comme porte d'entrée qui fournit une demande à des contrôleurs spécifiques. De cette façon, vous pouvez utiliser ce contrôleur frontal pour vérifier des choses courantes comme l'authentification des utilisateurs, Google Analitics et tout autre truc général que vous souhaitez faire et garder la structure MVC pure.

Ce n'est pas mon idée, mais Symfony Framework fonctionne de cette manière, donc je peux vous dire que d'après mon expérience, c'est une façon vraiment agréable et élégante d'implémenter un frontend.

guiman
la source