36 votes

Quelle est la bonne façon de gérer les données $ _POST dans MVC?

J'ai de la commune MVC situation dans mon système PHP: l' Controller obtenir une demande de l' View contenant $_POST données. Maintenant, j'ai trois manières de traiter les données:

a) L' Controller seulement des appels à l' Model et de la Model gérer l' $_POST données.
b) L' Controller transforme l' $_POST données dans des variables et de les transmettre Model.
c) L' Controller transforme $_POST données en Models'objet de domaine et seulement passer de l'objet à l' Model.

Actuellement, je suis à la suite d'Une option, mais je crois qu'il est mauvais, donc je pense de l'utilisation de l'option C.

Ainsi, selon MVC, ce qui est la bonne manière d'aborder $_POST données?

EDIT pour le moment, je n'utilise pas de framework MVC.

EDIT 2 en Général, le même Controller poignées de demande à partir d'un navigateur, d'un service web, une application hors connexion, etc, ou chacun a sa propre Controller?

26voto

tereško Points 32847

La meilleure option est d'utiliser #2 approche, avec quelques modifications.
Je voudrais écrire quelque chose comme ceci:

public function postLogin( $request )
{
     $service = $this->serviceFactory->build('Recognition');
     $service->authenticate( $request->getParam('username'),
                             $request->getParam('password') );
}
// Yes, that's the whole method

Il n'est pas nécessaire de créer des variables, si vous avez utilisé quelque chose comme un Request exemple de résumé l'entrée de l'utilisateur.

Aussi, vous pouvez remplacer l'Request::getParam()méthode avec quelque chose commeRequest::getPost()- bien que j'en suis venu à la conclusion que, dans une application structurée, l'GETetPOSTparamètres ne doivent pas partager le même nom.

L' serviceFactory qui vous voir dans l'extrait de code serait un objet que vous injectez dans le contrôleur et la vue de l'instance. Il vous permet de partager les mêmes instances de service entre les contrôleurs et les vues.

Il est responsable de la création de services (qui contient la logique de l'application, tout en laissant le domaine de la logique métier dans le domaine des objets), qui vous aide à isoler l'interaction entre le domaine des entités et de stockage des abstractions à partir de la couche de présentation.

Sur les autres options:

  • Le Contrôleur appelle le Modèle et le Modèle de gérer les $_POST données.

    Dans le MVC et MVC-inspiré des modèles de conception, le modèle devrait être au courant ni de l'interface utilisateur, ni de la couche de présentation dans son ensemble. L' $_POST variable en PHP est une superglobale.

    Si vous l'utilisez avec le modèle de couche, votre code est lié à l'interface web et même la demande de la méthode.

  • Les transformations du Contrôleur $_POST les données dans un Modèle objet et seulement passer de l'objet à modéliser

    Pas entièrement sûr de ce que vous entendez par cela. Semble que vous parliez de l'instanciation d'une abstraction, qui contiendrait à la demande de l'utilisateur. Mais dans ce cas, le contrôleur est responsable de l'instanciation/création de ladite structure, ce qui constituerait une violation du PRS.

La fermeture de notes:

Une chose que vous devez comprendre, c'est que, dans le contexte de basée sur le web applications MVC, l' Utilisateur de votre application est le navigateur. Pas vous. Navigateur envoie la demande, qui est géré par le mécanisme de routage et diffusé par le contrôleur. Et vue produit la réponse à votre navigateur.

Et l'autre chose, c'est: Modèle n'est ni une classe, ni un objet. Le modèle est une couche.


Mise à jour

Généralement, le même Contrôleur gère la demande à partir d'un navigateur, d'un service web, une application hors connexion, etc, ou chacun dispose de son propre Contrôleur?

Vous devriez être en mesure d'avoir un seul contrôleur, qui traite de toutes les formes de la demande. Mais c'est seulement à la condition, vous êtes réellement en utilisant la même application pour toutes les 3 cas d'utilisation.

Pour ce faire il y a deux conditions:

  • vous avez besoin d'abstraire l' Request exemple, que le contrôleur reçoit
  • la vue doit être instancié à l'extérieur du contrôleur

De cette façon, vous pouvez avoir une application pour répondre à toutes les exigences. Seule chose, que chaque variante possède différents, est l'étape bootstrap, où vous créez l' Request instance et sélectionnez la vue appropriée.

Dans la situation que vous avez décrite, l'évolution de la partie serait effectivement la vue, depuis un REPOS ou de service SOAP devrait produire une réponse différente qu'une simple application web.

3voto

didierc Points 8128

Il était une fois les trois niveaux l'architecture de l'application.

Tout dépend de votre framework MVC. Normalement, le Contrôleur fait le lien entre l'utilisateur et le modèle de couche, qui manipulent des objets du domaine.

Dans les premiers jours de la MVC en PHP, le modèle de la couche était en fait juste le domaine des objets, appelés modèles à cette fin. Certaines préféré dits modèles minces, qui ne donnent qu'une OO représentation des données, ce qui simplifie la persistance). Dans ce cas, le contrôleur de regrouper les dites actions, contenant la partie du traitement associé à une requête HTTP (fat controller).

D'autres incorporé la plupart du dit traitement dans le modèle d'objet avec des méthodes (modèle de graisse).

Cependant, à un certain point, vous devez analyser le contenu de la requête pour désinfecter et de les valider, et cela dépend de votre point de vue sera le format de la requête. D'assainissement peut être un contrôleur de tâche (cette demande ne doit contenir ces valeurs), alors que la validation est certainement un modèle de tâche (les valeurs doivent être de ces types).

Une question intéressante est: comment traitez-vous avec les actions impactant plusieurs objets de domaine? Que faire de la logique pour qui?

De nos jours, le modèle de la couche est composé de services de séparer les objets du domaine du mal à appréhender les contrôleurs, afin de limiter les dépendances entre les couches à leurs interfaces. C'est où la plupart de la demande de traitement est terminé.

Symfony2, par exemple, fournit une réponse sensée à cette question: à chaque étape du traitement d'une demande est mis en œuvre dans un morceau de code, qui pourrait être décrite comme suit:

  • la demande est d'abord transformé en un objet
  • cet objet est acheminé à l'aide d'un objet de routage
  • elle est confiée à un contrôleur
  • le contrôleur de transmettre la demande au service concerné par l'action, qui permettent de construire l'objet de la réponse

Le service de l'emploi est ensuite brisé en plusieurs étapes:

  • validation (un objet qui s'appuient sur des règles décrites dans un fichier séparé),
  • construction/mise à jour des objets du domaine (à l'aide de la sérialisation/à partir de db si nécessaire),
  • sélection d'un modèle pour la réponse,
  • la population du dit modèle avec les données pertinentes à partir des domaines.

CakePHP est un autre populaire cadre qui suit des concepts similaires: simple contrôleurs, et des services de l'encapsulation des objets du domaine.

Voir cette question pour un meilleur aperçu sur les concepts généraux.

Voir cette autre question pour les autres réponses.

Grâce à tereško pour ses précieux commentaires sur la question.

1voto

Rinzler Points 1459

je suis à l'aide de Zend et suivantes

la 2ème option .

Exemple d'un formulaire d'Inscription

étape 1 les formes m'envoie la valeur post sur le contrôleur spécifié

étape -2 je vais valider les valeurs d'un formulaire par exemple ( mail et url et vide de valeurs post ) par le biais de la validation côté serveur .

étape -3 envoyer l'objet d'une post données dans la variable ou a tout le modèle .

étape 4- contrôleur appelle le modèle .

étape -5 les modèles insère les valeurs post et crée un nouvel utilisateur .

Je pense que votre deuxième option est la meilleure, indépendamment de cadre ou approah que vous utilisez .

remarque - même contrôleur peut gérer tout dépend de la logique de l'application .

 but i prefer to keep different controller for differnt user request and user types

 it helps in keeping code readable managebale .

0voto

v2p Points 2196

Regardez certains frameworks MVC.

Par exemple, dans Yii vous pouvez écrire un tel code à l'intérieur de l'action:

$model = new Model();
if(isset($_POST['Model'])) {
    $model->attributes = $_POST['Model'];
}

Noter, que tous attributes de votre modèle doit être transmis par le biais de règles de validation. Dans Yii validation s'applique pendant (en fait, avant d') $model->save()

Voir:

  1. http://www.yiiframework.com/doc/guide/1.1/en/form.model#securing-attribute-assignments
  2. http://www.yiiframework.com/doc/guide/1.1/en/basics.mvc

0voto

spanjeta Points 808

"C" est la meilleure option. Vous ne devez pas laisser les données brutes $ POST dans le modèle, car ce dernier est censé être un magasin de traitement générique et des opérations de chargement principalement.

Exemple: le même modèle peut être utilisé interface Web et services Web. Sur le Web, $ _POST est valide, mais pas pour les services Web. Donc, le modèle ne se soucie pas de la manière dont les données sont reçues mais seulement de la manière de la stocker et de la charger.

Yii est définitivement une implémentation propre de MVC.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X