2010-05-16 6 views
1

Je suis sur le point de faire un site Web PHP en utilisant le modèle MVC. Je n'utilise pas de framework car le site est assez simple et je sens que cela me donnera une bonne opportunité d'en apprendre directement sur le pattern. J'ai quelques questions.MVC: Vues imbriquées et contrôleurs (pour un site Web)

Question 1: Comment dois-je organiser mes vues? Je pense avoir une vue de page qui aura l'en-tête et le pied de page, et qui permettra à une vue de contenu d'être imbriquée entre eux.

Question 2: Si j'ai 5 pages de contenu, devrais-je créer 5 vues différentes qui peuvent être utilisées comme contenu imbriqué dans la vue de page? Ou, devrais-je les faire tous étendre une vue abstraite appelée AbstractContent?

Question 3: Qu'en est-il des contrôleurs? Je pense qu'il devrait y avoir au moins un contrôleur principal. Mais alors, d'où vient la requête? Pour un autre contrôleur? Ou devrais-je simplement appeler la vue de la page et en rester là? Je pensais que les contrôleurs étaient censés gérer les entrées, éventuellement modifier un modèle, et sélectionner une vue. Mais que se passe-t-il si l'une des vues imbriquées dans la vue qu'un contrôleur appelle appelle une entrée supplémentaire à analyser?

Question 4: Les contrôleurs sont-ils autorisés à transmettre des paramètres dans la vue? Ou le contrôleur devrait-il simplement modifier le modèle, ce qui affectera alors la vue? Ou est le modèle uniquement pour l'accès DB et d'autres choses de ce genre?

Répondre

2

1 - Ceci est une question de préférence. Le moyen le plus simple serait d'avoir un fichier d'en-tête et de pied de page séparé. Ensuite, vous pouvez faire quelque chose comme ça dans votre contrôleur page

$title="Page Title"; 
$var1 = 'var1'; 
$var2 = 'var2'; 
$var3 = array("asdf","adsfasdf","234");  

include(HEADER); //$title is in header 
include(DIR_VIEWS . 'page.php'); //$var1/2/3 are in page.php 
include(FOOTER); 

// variable were created before pages were included so they will be set in the templates 

Si vous deviez aller la route imbriquée vous devez commencer à jongler avec str_replace et qui démarre en direction d'un moteur de modèle, hors de portée pour cette réponse.

2 - Pas besoin de créer des objets de vue. Une "vue" peut juste être un fichier sur votre système de fichiers qui contient le html pour cette vue. Comme mon exemple ci-dessus. Ces pages peuvent également contenir des variables php to loop/echo de base.

3 - Vous décrivez un contrôleur frontal (parfois appelé répartiteur ou routeur). C'est vraiment le chemin à parcourir. Il existe plusieurs méthodes pour créer un contrôleur frontal.

Vous pouvez avoir un tableau d'URL qui pointent vers des contrôleurs.

$routes = array (

    '~^/home/$~' => 'home.php', 
    '~^/contact/$~' => 'contact.php', 
    '~^/blog/.*?$~' => 'blog.php' 

); 

ou vous pouvez utiliser le premier « répertoire » dans l'URL comme le nom du contrôleur et charger ce fichier former votre répertoire du contrôleur.

4 - Le point entier du contrôleur est d'obtenir des informations du modèle et de transmettre les données à la vue.


Edité pour commentaires


Si vous voulez un tas de points de vue d'avoir une barre latérale vous suffit d'inclure ce point de vue dans l'autre vue. Par exemple:

<div id="content"> 
    <p>lorem ispum stuff</p> 
</div> 
<?php include(DIR_VIEWS . 'sidebar.php'); 

Assurez-vous que dans les contrôleurs que les pages de « contrôle » avec les barres latérales vous comprennent un code pour les fonctions de la barre latérale:

if ($_GET['keywords']) { 
    $sidebar_search_results = get_search_results($_GET['keywords']); 
} 
// this code should be in a file that you include 

$sidebar_search_results pourrait être un tableau de résultats que l'affichage de votre barre latérale parse et affiche.

+1

Pour les vues imbriquées, je pense que mon problème est le suivant: que se passe-t-il si j'ai 4 vues très différentes - mais toutes partagent un élément commun (disons un panneau News). Je souhaite que le panneau Actualités soit imbriqué dans chacune des 4 vues principales. Le problème est que le panneau News a besoin d'obtenir des données quelque part. Et si le panneau de nouvelles a une fonction de recherche? Ensuite, il aurait aussi besoin d'un contrôleur, pour s'assurer que les paramètres de recherche sont gérés. Comment pourrais-je faire quelque chose comme ça? – Cam

+0

@ "Edité pour commentaire" de Galen: Avec des vues imbriquées, l'idée est que les vues doivent être assez indépendantes - c'est-à-dire que je voudrais pouvoir les changer à tout moment. De cette façon cependant, j'ajoute un code inutile au contrôleur en haut, ce qui pourrait devenir très ennuyeux si j'ai trop de vues imbriquées. Qu'est-ce que tu penses? – Cam

+0

Si vous avez une fonction de recherche, vous aurez besoin de code pour faire la recherche. Cela va devoir être dans le contrôleur, peu importe quoi. Si vous avez besoin de changer la disposition de la barre latérale, il suffit d'écraser sidebar.php avec le nouveau code. – Galen

2
  1. Pensez à quoi vous voudriez vos réponses HTTP pour ressembler à: pages pleines avec/sans navigation, pages dépouillées pour l'impression, JSON & réponses XML, un index/plan du site. Après avoir senti que le site est en train de se former, ajoutez de plus en plus de raccourcis pour obtenir votre réponse avec le moins de code possible.
  2. Si la mise en page est similaire, j'utiliserais la même vue et chargerais du contenu à partir d'un modèle (éventuellement une base de données).
  3. Découvrez le Front Controller pattern: vous devriez toujours pouvoir recouper la demande en un seul point d'entrée. Je mettrais quelque chose de façon hiérarchique devant vos contrôleurs et aurais alors un contrôleur par "page principale" (forum, blog, news). C'est suffisant pour contrôler, mais vous devrez décider quels morceaux sont assez grands/petits pour vous.
  4. Les contrôleurs sont responsables de tout ce qui est transmis dans les vues. Les contrôleurs doivent extraire les données & paramètres & et les transmettre aux vues.
+0

Ceci est utile; +1 :) Mais je pensais que le contrôleur apporte des modifications au modèle (c'est-à-dire met à jour le db etc) alors que la vue récupère les données (comme dans ce diagramme: http://en.wikipedia.org/wiki/Model%E2%80%93view% E2% 80% 93contrôleur). N'est-ce pas le cas? – Cam

+1

J'ai lu plus attentivement maintenant, vous avez dit "Je pensais que les contrôleurs étaient censés gérer l'entrée, éventuellement modifier un modèle, et sélectionner une vue." avec lequel je suis d'accord, alors oui! – chelmertz

+0

Donc la vue devrait être capable d'aller chercher des données directement à partir du modèle? Par exemple, est-ce que je pourrais demander au contrôleur de modifier certains paramètres de l'utilisateur et que la vue récupère ces paramètres à partir du modèle (le mdoel fournirait une interface facile à utiliser pour cela)? – Cam

2

Question 1:

Ceci est en effet une façon de faire, et que je l'utilise AllWays.

Question 2:

Il suffit de garder une vue aussi simple que possible. J'ai tendance à créer seulement 5 vues séparées (fichiers php simples).

Question 3:

Dans le motif mvc normal, il y a une unité de commande avant (quel système d'exploitation qu'un fichier d'amorçage, le index.php) qui exécute une commande.

En HMVC, les contrôleurs peuvent envoyer une requête supplémentaire à d'autres contrôleurs.

Question 4:

Le modèle normal MVC applique sur les applications normales, où les vues sont persistantes et peuvent observer les modèles. Avec les applications web ce n'est pas possible, car chaque requête est rechargée. Le motif le plus utilisé est donc de laisser le contrôleur passer les paramètres à la vue.

+0

+1, merci. 1, 2, 3 ont un sens.Pour 4, il est bon de savoir que je peux passer des paramètres à la vue. Cependant, puis-je également interagir avec un modèle pour obtenir des informations de la base de données ou doit-il être fourni par le contrôleur? Aussi - est-ce que chaque vue nécessite spécifiquement un contrôleur et un modèle exactement? Je pensais plutôt à avoir un contrôleur par vue, et un modèle par objet de la base de données que je devrais résumer. – Cam

Questions connexes