Quelle est la bonne façon de les gérer $_POST données dans MVC?
J'ai de la commune MVC situation dans mon système PHP: le Controller
obtenir une demande de la View
contenant $_POST
de données. Maintenant, j'ai trois manières de traiter les données:
a) La Controller
appelle le Model
et la Model
poignée de la $_POST
de données.
b) La Controller
transforme le $_POST
données dans des variables et de les transmettre à Model
.
c) La Controller
transforme $_POST
des données dans un Model
s'objet de domaine et seulement passer de l'objet à 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, quelle est la bonne façon de les gérer $_POST
données?
MODIFIER pour le moment, je n'utilise pas de framework MVC.
EDIT 2 Généralement, les mêmes Controller
poignées de demande à partir d'un navigateur, d'un service web, une application hors connexion, etc, ou chacun a sa propre Controller
?
- Symfony2 est principalement suivant l'option C, pour ce que ça vaut.
- D'habitude, je préfère la 2e option. Tout traitement de données doit être fait dans le contrôleur, et seulement de transmettre les données nécessaires pour modèle ou de la vue..
Vous devez vous connecter pour publier un commentaire.
La meilleure option est d'utiliser #2 approche, avec quelques modifications.
Je voudrais écrire quelque chose comme ceci:
Il n'est pas nécessaire de créer des variables, si vous avez utilisé quelque chose comme un
Request
instance abstraites de l'entrée de l'utilisateur.La
serviceFactory
que vous voyez 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 des objets du domaine), 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:
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. Le
$_POST
variable en PHP est un 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.
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 PRS.
De clôture notes:
Une chose que vous devez comprendre, c'est que, dans le contexte de basée sur le web applications MVC, le 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
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.
De le faire il y a deux conditions:
Request
exemple, que le contrôleur reçoitDe 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 le
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.
domainModelFactory
etdataMapperFactory
dansServiceFactory
b) InjecterdomainModelFactory
etdataMapperFactory
directement à unService
, quelque chose comme$this->domainModelFactory->create('user')
. ?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).
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:
Le service de l'emploi est ensuite brisé en plusieurs étapes:
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 d'autres réponses.
Grâce à tereško pour ses précieux commentaires sur la question.
je suis à l'aide de Zend et suivants
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 vous utilisez .
note - même contrôleur peut gérer tout dépend de la logique de l'application .
Oeil à certains frameworks MVC.
Par exemple, dans Yii vous pouvez écrire un tel code à l'intérieur de action:
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:
'C' est la meilleure option. Vous ne devriez pas laisser brut $de données de POSTES aller dans le modèle comme le modèle est censé être générique de la manipulation de stocker et de charger des opérations principalement.
Exemple : même modèle peut être utilisé de l'interface web et de services Web. Sur le Web $_POST n'est valable que pour les services web de ses pas. Si le modèle ne marche pas soin de la manière dont les données sont reçues, mais seulement la façon de stocker et de le charger.
Yii est certainement un nettoyage de mise en œuvre de la MVC.