Comprendre MVC: Quel est le concept de « Fat » sur les modèles, « maigre » sur les contrôleurs?

StackOverflow https://stackoverflow.com/questions/3109715

Question

Je suis en train de comprendre le concept de « Fat » sur les modèles vs « maigre » sur les contrôleurs et de ce que j'ai discuté je l'exemple suivant (ce qui est tiré d'une discussion freenode):

Q: Le paradigme MVC, ses modèles Fat ces, contrôleurs maigres. Je pense ici, si j'ai beaucoup de méthodes (sur commande) qui utilise seulement quelques méthodes abstraites à CRUD (le modèle), je suis un contrôleur créent la graisse au lieu d'un modèle? Ou disent-ils, modèle gras, refearing dans ce qui est retourné et non typé? que quelque chose que je ne l'ai jamais compris =) Tous les commentaires sont appréciés! Merci beaucoup

OBS1: Je ne fais pas ce qui est ment par le modèle, dans le contrôleur, j'ai juste ce qui est des méthodes de contrôle allant au modèle

OBS2: let disons le "checkIfEmailExists ()", a "john@hotmail.com", en tant que paramètres. Cette méthode, obtenir le retour de la méthode de modèle qui querys si cette exist param dans le tableau, le retour booléenne. Si est 0, « checkIFemailExists () » appellera une méthode modèle diferent, celui-ci, il est juste une autre méthode abstraite, qui effectue une opération de mise à jour.

OBS3: Les "checkIfEmailExists ()", isnt juste un contrôleur? Il ne fait aucune exécution CRUD, il vient de comparer les valeurs, etc. C'est ce qui est me confondre, parce que dans ma tête c'est un contrôleur: S

Notes: Je suppose que ce n'est pas le meilleur exemple, car en disant « vérifier si quelque chose existe », sonne comme une requête de mon opération de la table

Q2: une autre question, donc, disons que j'ai une forme de vue, d'où ce paramètre d'adresse e-mail est envoyé. Voulez-vous dire le point de vue va directement au modèle?

Q3: Faut-il pas l'acte de contrôleur entre eux? thats le paradigme

FINAL NOTE: La discussion terminée, en disant que je me trompe, souhait est ok (j'apprends). Mais, donc, ce qui est les bonnes réponses pour Q2 et Q3?

Merci pour votre atention

Était-ce utile?

La solution

Votre demande est M. Il devrait être en mesure de se tenir indépendant de V et C. V et C forment l'interface utilisateur à votre application. Que ce soit une interface Web ou une interface de ligne de commande ne doit pas question pour la logique métier de base de votre application à exécuter. Vous voulez que le modèle soit gras avec la logique métier.

Si vous avez un contrôleur de graisse au lieu, par exemple complète avec la logique métier, vous ne pas adhérer à l'objectif de MVC. est la manipulation et de déléguer des demandes d'assurance-chômage au modèle unique responsabilité d'un contrôleur. Voilà pourquoi il devrait être maigre. Il ne doit contenir le code nécessaire pour ce qu'il est responsable de.

Exemple simplifié

public function fooAction()
{
    if(isset($_POST['bar'])) {
        $bar = Sanitizer::sanitize($_POST['bar']);
        $rows = $this->database->query('SELECT * from table');
        try {
            foreach($rows as $row) {
                $row->foo = $bar;
                $row->save();
            }
        } catch (Exception $e) {
            $this->render('errorPage');
            exit;
        }
        $this->render('successPage');
    } else {
        $this->render('fooPage');
    }
}

Quand il doit être

public function fooAction()
{
    if(isset($_POST['bar'])) {
        $success = $this->tableGateway->updateFoo($_GET['bar']);
        $page    = $success ? 'successPage' : 'errorPage';
        $this->render($page);
    } else {
        $this->render('fooPage');
    }
}

parce que tout est le contrôleur a besoin de savoir. Il ne faut pas mettre à jour les lignes. Il faut simplement dire au modèle que quelqu'un a demandé ce changement. La mise à jour est la responsabilité de la classe gestion des lignes. En outre, le contrôleur ne doit pas nécessairement désinfectez la valeur.

En ce qui concerne Q2 et Q3, s'il vous plaît voir ma réponse à

Autres conseils

Je travaille avec paradigme MVC depuis longtemps et je peux partager avec vous mon expérience.

La partie « modèle » est responsable de gérer toutes les choses qui ne sont pas strictement « web », telles que la validation, la logique, l'accès aux données, etc. Pensez-y comme une sorte de couche d'affaires mixte + couche d'accès aux données. Vous pouvez également BLL + DAL dans les assemblées distinctes et utiliser la partie « modèle » de MVC comme un pont entre votre BLL et votre application, ainsi que l'ajout de classes qui sont spécifiques à l'application MVC et non liés à l'BLL, comme les classes vidéotex , etc.

La partie « contrôleur » est ce qui prend en charge les trucs spécifiques Web, comme l'authentification, les cookies, gets et des posts, querystrings, etc. Il utilise le présent des choses dans le modèle et / ou le BLL et envoie les données qui ont à rendre à l'utilisateur aux vues.

Les « vues » sont vos modèles HTML qui peuvent recevoir des données du contrôleur, et l'afficher. Aucune opération logique ne devrait jamais être fait dans les vues, donc pas « si » déclarations, pas de boucles, etc. Si vous vous trouvez avoir ces besoins, alors vous avez besoin des méthodes « d'aide » qui créent le code html désiré puis les appeler à partir de la vue. Donc, vues ne reçoivent que des données et offre aux liens utilisateur / formulaires pour afficher les données à un contrôleur, mais ils ne le font pas quoi que ce soit compliqué.

Espérons que cela éclaircit certains de vos doutes.

je montrerai mon parti pris (vers C #) mais je ne pense pas que cela fasse beaucoup de sens de parler de MVC, sauf si vous utilisez un style de programmation orienté objet. Un contrôleur est pas une méthode, il est une collection de méthodes regroupés dans une classe, dont chacune gère une certaine entrée (URL / demande). Un modèle est un moyen d'accéder à la base de données (qui est une couche d'accès aux données), il est une collection de propriétés et méthodes qui encapsulent une entité identifiable dans votre application: une personne, une réservation, un produit, etc. La meilleure façon de penser est que l'entrée de la poignée de contrôleurs, les modèles contiennent des données -. mais, bien sûr, qui est simplifié

La question de « Fat » vs « maigre », pour moi, est la question de savoir où le votre vie logique métier. Si vous avez beaucoup de logique dans votre contrôleur liés, et non simplement la gestion des entrées, mais la mise en œuvre la logique métier, ensuite ceux de contrôleur sont relativement plus gras que si vous les utilisez simplement de traduire les demandes en assemblages de modèles qui sont remis hors d'une vue de rendre . Dans mon expérience, ce n'est pas toujours soit / ou d'une décision. Beaucoup de temps, vous avez la logique métier (validation, entretien de la relation, l'audit) dans le modèle pendant que vous avez la logique d'application (validation de l'autorisation, aseptisation, etc.) dans le contrôleur, aussi.

Je pense qu'une bonne séparation contrôleur / modèle pourrait être en laissant le contrôleur faire des opérations à charge « syntaxique » sans / peu la logique métier impliqués et le modèle d'utilisation pour effectuer des opérations « sémantiques ».

Un bon exemple de cette séparation est:

vous pouvez effectuer une vérification regexp d'un courrier électronique dans le contrôleur, mais vous ne serez pas effectuer une correspondance ldap de cet e-mail dans le contrôleur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top