2009-10-08 5 views
8

J'utilise Kohana, mais je pense que cette question est plus générale.Où devrait se produire la validation de forme dans un projet MVC?

J'ai fait la validation de forme dans le contrôleur, et cela a bien fonctionné jusqu'ici. Mais dernièrement, j'ai rencontré un problème.

J'ai un modèle de commentaires, et j'envoie des commentaires de quelques contrôleurs différents. Au lieu d'avoir un validateur dans chaque contrôleur, je l'ai placé dans le modèle.

Ce qui est grand parce que

  • Un seul endroit pour changer/ajouter des règles de validation (SEC)

Ce suce parce

  • J'ai besoin évidemment de retourner un succès ou l'échec au contrôleur, et la bibliothèque de validation de Kohana renvoie les erreurs sous la forme d'un tableau. Donc, mon retour ressemble à ceci

SUR LE SUCCÈS

array('success' => true); 

SUR FAIL

array('success' => false, $errors); 

Je ne peux pas empêcher de penser que cela est faux. Il se sent faux.

Si je le fais dans le contrôleur, je peux simplement faire

if ($post->validate()) { 
    doWhatever(); 
} else { 
    $this->template->formErrors = $post->errors('form_errors'); 
} 

Ce qui semble mieux (pour moi).

Y a-t-il une meilleure façon de procéder? Devrais-je valider dans le contrôleur ou la méthode? Est-ce que je deviens fou?

+0

C'est comme ça que je le fais et ensuite je vérifie l'indice de succès pour décider quoi faire (pas avec Kohona, mais généralement.) –

Répondre

4

Honnêtement, je ne vois rien de mal avec votre méthode, alex. Il semble que vous le faites correctement. Vous suivez le principe DRY, qui est généralement le critère pour mesurer si je fais quelque chose de bien quand il s'agit de MVC.

0

Je préfère ne pas me répéter sur les sentiments, faire la méthode. En outre, le tableau est pratique car vous pouvez afficher les erreurs du tableau dans une vue si vous le souhaitez. Je n'ai pas utilisé kohana, mais la méthode de validation que j'ai utilisée dans ASP.NET MVC me fournit une liste similaire et je peux ensuite montrer à l'utilisateur ce qui ne va pas.

0

Vous devriez toujours (si vous le pouvez) valider sur le client (JS). Et puisque cela peut être contourné - vous validez également sur le serveur. Et oui - mettre votre validation sous une forme réutilisable est une excellente idée

+0

A moins que vous ne vouliez simplement déplacer votre réponse - donnez une courtoisie d'expliquer pourquoi vous donnez -1 à cette réponse. Valider sur le client - il est logique qu'il soit beaucoup plus rapide que le retour sur le serveur. Mais compter uniquement sur le client est dangereux puisqu'il peut être facilement contourné. D'où ma réponse – Bostone

+0

Je pense que vous devriez mettre plus d'efforts dans la réponse en premier lieu, pas seulement dans le commentaire. Juste pour être un juge, j'ai compansé ce bâtard downvoter. :) – pestaa

+0

Merci :) Toutes mes réponses ne sont pas si courtes. J'essayais juste d'ajouter ma voix au refrain – Bostone

2

Modèles de graisse. Petits contrôleurs. C'est comme ça que je l'ai toujours fait. La validation à moi est à la couche de données. La couche de données (pour moi, au moins) est le modèle. J'utilise normalement CakePHP comme framework MVC ... C'est peut-être pour ça que ma validation est au modèle. C'est le chemin de CakePHP.

0

Je fais également la validation dans le modèle. La plupart des bibliothèques de modélisation comme ORM, Auto_Modeler etc. prennent également en charge la validation. BTW c'est plus rapide si vous demandez sur le canal #kohana sur FreeNode (irc.freenode.net).Nous (habituellement) ne mordons pas :)

6

Je ne pense pas que toutes les règles de validation puissent entrer dans le modèle. La validation porte sur le formulaire (ou l'API). Le fait est que lorsque vous validez vos données, la plupart des choses dépendent du contexte .

Par exemple, s'agit-il d'un utilisateur connecté effectuant l'action? Vous ne pouvez pas coupler votre couche d'authentification avec le modèle en cours de validation. Donc, tous les contrôles doivent aller à l'intérieur du contrôleur. Le modèle est indépendant du contexte; le formulaire "appartient" au contrôleur et est sensible au contexte.

Je pense que d'avoir par forme règles de validation , plus de base contrôles en modèle de données bien formé est le chemin à parcourir. Si vous appelez Auth :: instance() ou Session :: instance() dans la fonction validate() de votre modèle, vous vous trompez.

Questions connexes