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: P>
Où dois-je mettre un 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? P> mysql_query code>? strong> p>
5 Réponses :
Pour un, n'utilisez pas 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. P> update strong> p> 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? " p> 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: p> 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. p> 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). P> p> mysql_query () code> et la famille; Ils sont obsolètes, alors envisagez également d'apprendre à propos de PDO et / ou de MySQLI.
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. P>
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. P>
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. P>
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: p>
Voici le diagramme de séquence MVC qui montre le débit lors d'une requête HTTP: p>
p>
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. P>
Pour aller encore plus loin, votre modèle ne doit pas contenir le code d'accès à la base de données. Cela appartient à une autre couche située à l'extérieur du modèle / View / Controller: Ceci s'appelle la couche De cette façon, vous ne touchez jamais de code SQL (mon) code SQL. La couche de persistance s'occupe de cela pour vous.
Je vous conseille vraiment d'examiner un didacticiel de doctrine, il s'agit d'un moyen de créer vos applications. P> au lieu de travailler avec des données brutes chargées à partir de la base de données, vous créez des objets contenant vos données, et le comportement associé à celui-ci. p> par exemple, vous pourriez avoir une classe vous Controller n'interagira qu'avec des objets: P> utilisateur code>, telle que: p> class UserController
{
public function testAction()
{
// ...
$user = $em->getRepository('User')->find(123); // load User with id 123
$user->setName('John'); // work with your objects,
echo $user->getName(); // and don't worry about the db!
$em->flush(); // persist your changes
}
}
Vous auriez pu répertorié les livres que vous lisiez, car la plupart des livres PHP (sinon tous), qui touchent le MVC, ont tort. P>
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" em> . 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 =] p>
Pas vraiment. Au moins pas le MVC classique, car il était défini pour SmallTalk . P>
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 . P>
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"). P>
         : //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. P>
contrôleur ont une responsabilité majeure dans le MVC (je vais parler de Model2 Mise en œuvre ici): P>
Exécuter des commandes sur les structures à partir de la couche modèle (services ou objets de domaine), qui modifient l'état desdites structures. P> BlockQuote>
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 P>
Où dois-je mettre le code associé à SQL? h2>
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. P>
En outre, veuillez consulter ces posts apparentés: H3>
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 b> 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 code> utilisé pour entrer le produit souhaité.
Avec le concept :: Classe Code> Vous voulez dire qu'il y aura une classe avec des méthodes statiques (comme Domaine de construction () code>, buildmapper () code>), Et ces méthodes renvoient Objets de domaine CODE> ou Mappeurs de données Code> respectivement?
Non, wiith :: classe code> je voulais dire foo (classname :: classe) code>, 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 i> interagit avec la mutation du calque modèle installations?
"Où mettre un
mysql_query code>?" Vous ne: S'il vous plaît, arrêtez d'écrire un nouveau code avec les fonctions antiquesmySQL _ * code>. 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 _ * code> oupdo code>) dans le modèle. Et NON B> 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"?