8
votes

Où dois-je mettre une requête de base de données en MVC?

Les derniers jours, j'ai énormément de lecture de livres et de pages Web sur OOP et MVC en PHP, afin que je puisse devenir un meilleur programmeur. Je suis venu sur un petit problème dans ma compréhension de MVC:

Où dois-je mettre un mysql_query ?

Dois-je le mettre dans le contrôleur et appeler une méthode sur un modèle qui renvoie des données en fonction de la requête fournie? Ou devrais-je le mettre dans le modèle lui-même? Les deux options sont-elles des ordures totales?


3 commentaires

"Où mettre un mysql_query ?" Vous ne: S'il vous plaît, arrêtez d'écrire un nouveau code avec les fonctions antiques mySQL _ * . Ils ne sont plus entretenus et la communauté a commencé le processus de dépréciation . Au lieu de cela, vous devriez en apprendre davantage sur Instructions préparées et utiliser soit PDO ou MYSQLI . Si vous ne pouvez pas décider, Cet article aidera à choisir. Si vous souhaitez apprendre, Voici un tout bon tutoriel lié à la PDO .


Je ferais la requête ( mysqli _ * ou pdo ) dans le modèle. Et NON Le modèle n'est pas seulement repsonishant pour accéder à la base de données.


Puisque je ne suis toujours pas encore un bon programmeur, je n'étais pas au courant de cela. Cependant, je voulais de toute façon vouloir m'installer sur le style ormes qui semble être basé sur PDO. Mais la question concernant le MVC n'est toujours pas claire: où est-ce que je demande des données de la base de données? Un modèle générique de lecture-accès à la DB ou un modèle pour chaque table / toute action spécifique? Dans le second cas: comment je sauverais le code? Est-ce le cas où je créerais un "assistant"?


5 Réponses :


2
votes

Pour un, n'utilisez pas mysql_query () et la famille; Ils sont obsolètes, alors envisagez également d'apprendre à propos de PDO et / ou de MySQLI.

Le modèle s'occupe de la manipulation de données; Il fournit une interface au contrôleur par lequel il récupère et / ou stocke des informations. Donc, ce serait un endroit primordial où les actions de la base de données ont lieu.

update

Pour répondre à une question posée par le PO dans les commentaires: "Un générique modèle pour l'ensemble de la DB ou un modèle pour chaque table / action? "

Les modèles sont conçus pour abstraire des tables individuelles à l'extérieur (bien qu'il existe des modèles qui gèrent exclusivement une table unique); Par exemple, au lieu de demander à tous les articles, puis de faire appel aux noms d'utilisateur pour les auteurs, vous auriez une fonction comme ceci: xxx

Combien de modèles que vous allez créer en grande partie dépend de la manière dont Big the Project est et la manière dont les données sont interdécites. Si vous pouvez identifier des groupes de données indépendants, il est probable que vous créiez un modèle pour chaque groupe; Mais ce n'est pas une règle dure et rapide.

La manipulation des données peut faire partie du même modèle, à moins que vous ne souhaitiez une séparation claire entre les modèles en lecture seule et en écriture (je ne connais pas une situation qui mérite cela, mais qui sait).


0 commentaires

2
votes

Le modèle contient les objets de domaine ou les structures de données représentant l'état de l'application. [Wikipedia] . Donc, le modèle serait l'endroit idéal pour faire appel à la base de données.

dans le "classique" (manque de meilleur mot guichet automatique de mots) modèle MVC La vue permettrait d'obtenir l'état actuel du modèle.

Ne faites pas l'erreur en disant que le modèle consiste à accéder à la base de données. C'est plus que d'accéder à la base de données.


0 commentaires

7
votes

Les classes de modèle et d'entité représentent les données et la logique d'une application, ce que de nombreuses appels logique commerciale. Habituellement, il est responsable de:

  1. stockage, suppression, mise à jour des données d'application. En règle générale, il inclut les opérations de base de données, mais la mise en œuvre des mêmes opérations invoquant des services Web externes ou des API n'est pas une inhabituelle du tout.
  2. encapsulant la logique d'application. C'est la couche qui devrait mettre en œuvre toute la logique de l'application

    Voici le diagramme de séquence MVC qui montre le débit lors d'une requête HTTP:

    Entrez la description de l'image ici

    Dans ce cas, le modèle est le meilleur endroit pour implémenter le code récité pour accéder à la base de données.


0 commentaires


15
votes

Matériaux sur le sujet de MVC

Vous auriez pu répertorié les livres que vous lisiez, car la plupart des livres PHP (sinon tous), qui touchent le MVC, ont tort.

Si vous voulez Pour devenir un meilleur développeur, je vous recommanderais de commencer par l'article de Marting Fowler - Architectures d'interface graphique < / em> . Suivi du livre du même auteur - "motifs de l'architecture d'application d'entreprise" . Ensuite, la prochaine étape serait pour vous de rechercher Principes solides et comprendre comment Code d'écriture qui suit Law of Demeter . Cela devrait couvrir les bases =]

puis-je utiliser MVC avec PHP?

Pas vraiment. Au moins pas le MVC classique, car il était défini pour SmallTalk .

Au lieu de PHP, vous avez 4 autres modèles visant le même objectif: MVC Model2, MVP, MVVM et HMVC. Encore une fois, je suis trop paresseux pour écrire des différences une fois de plus, je vais donc créer un lien vers un ancien commentaire de la mienne .

Qu'est-ce que modèle?

première chose à comprendre est que le modèle en MVC n'est pas une classe ou un objet. C'est une couche qui contient une multitude de classes. Fondamentalement, la couche de modèle est toutes des couches combinées (cependant, la deuxième couche à laquelle il devrait être appelé "couche d'objet de domaine", car il contient "des objets de modèle de domaine"). Si vous souhaitez lire un résumé rapide sur ce qui est contenu dans chaque partie de la couche modèle, vous pouvez essayer de lire Cet ancien commentaire ( Passer à la section "Note latérale").

         : //i.stack.imgur.com/pkrm4.gif "ALT =" La couche de modèle consiste en tous les 3 cercles concentriques ">
L'image est prise de Calque de service article sur le site de Fowler.

Que fait Les contrôleurs font?

contrôleur ont une responsabilité majeure dans le MVC (je vais parler de Model2 Mise en œuvre ici):

Exécuter des commandes sur les structures à partir de la couche modèle (services ou objets de domaine), qui modifient l'état desdites structures.

Il a généralement une responsabilité secondaire: se lier (ou passer autrement) des structures de couche de modèle à la vue, mais cela devient une pratique discutable, si vous suivez SRP

Où dois-je mettre le code associé à SQL?

Le stockage et la récupération de l'information sont traités à la couche source de données et est généralement implémentée comme Datamapper (ne confondez pas avec les ordures, ce qui abuse qui nom) , que les informations de celui-ci ont été stockées. Et ni cela, aucun cas sur l'endroit où vous mettez les données. Il pourrait être stocké dans MySQL ou PostgreSQL ou une base de données NOSQL. Ou peut-être poussé à l'API de repos à distance. Ou peut-être que le mappeur était une simulacre pour les tests. Tout ce que vous devriez faire, pour remplacer le mappeur, fournit cette méthode avec une usine différente.

En outre, veuillez consulter ces posts apparentés:


7 commentaires

Votre code fourni doit être mis en œuvre dans un service?


@ Dios231 Oui. Ou du moins le gist de celui-ci (notez que le code est de près de 4 ans .. Comment se passe votre code de 4 ans). De nos jours, j'utiliserais un conteneur DI pour fournir leur service avec des dépendances nécessaires au lieu d'utiliser des usines. Et si J'ai toujours utilisé des usines de cette manière, les objets de domaine et les mappeurs de données auraient des usines distinctes, avec :: Classe utilisé pour entrer le produit souhaité.


Avec le concept :: Classe Vous voulez dire qu'il y aura une classe avec des méthodes statiques (comme Domaine de construction () , buildmapper () ), Et ces méthodes renvoient Objets de domaine ou Mappeurs de données respectivement?


Non, wiith :: classe je voulais dire Cette nouvelle fonctionnalité dans PHP 5.5. Cela fonctionne assez bien avec des espaces de noms et des aliasings. Lorsque vous écrivez foo (classname :: classe) , la fonction reçoit est un nom de classe complète en tant que chaîne. De cette façon, vous n'avez pas votre code rempli de chaînes codées dures.


Donc, fondamentalement, la distinction entre la vue et le contrôleur en MVC est celle entre accesseur et mutateur du modèle? Les vues sont des objets UI qui présentent des données de modèle à l'utilisateur, tandis que les contrôleurs sont des objets qui prennent des commandes utilisateur et les utilisent pour muter le modèle. Cependant, dans de nombreuses applications d'interface graphique, ces choses semblent en quelque sorte mélangées, par exemple. Nous pouvons avoir un ensemble de boutons (Approvisionnement de commandement) qui dépend de l'état modèle. Quels sont ces boutons? Font-ils partie d'une vue ou d'un contrôleur, et ce qui déterminent quels boutons sont montrés? J'ai souvent entendu quelque chose comme


"Les contrôleurs déterminent quelles vues à utiliser", mais cela semble être une deuxième responsabilité après "mutation du modèle", il semble donc qu'il semble que quelque chose soit un quatrième aspect ici et c'est un aspect "méta-vue" qui détermine les points de vue et contrôleurs de présenter l'utilisateur avec un état modèle donné, sinon il semble que la vue et le contrôleur devait se comprimer d'une certaine manière dans ce cas car nous avons une installation de contrôleur en fonction de l'état modèle et donc dans la partie présente un état modèle à l'utilisateur (assumer la responsabilité ).


Ou cela viendrait-il juste être considéré comme une vue, même s'il fournit à l'utilisateur un contrôleur et non une autre sous-vue, tant que la vue fournie par le contrôleur ne directement interagit avec la mutation du calque modèle installations?