Bonjour,
Je ne sais pas si ce post à sa place dans ce forum si ce n'est pas le cas je m'excuse par avance.
Voilà j'aimerais avoir vos avis concernant ma manière de pratiquer la conception MVC avec PHP5. Cette pratique est nouvelle pour moi.
J'ai lu les différents tutoriaux de developpez ainsi que ceux sur Zend Framework.
Je ne souhaite pas utiliser Zend pour diverses raisons dont le fait que je travaille sur de "petits" projets persos. Je pense avoir bien compris comment ça doit fonctionner mais je veux être sur.
Je vais donc vous expliquer comment je procède mais avant ma première question concerne le Front Controller, est-il obligatoire dans le modèle MVC ? Ou peut-on avoir simplement un controller par page ?
Pour l'exemple concret, je travaille sur un moteur de forum. Voilà comment j'ai découper la première page c'est à dire celle qui liste les forums (et les catégories et sous-catégories dans mon cas)
-un bloc Header (haut de page) (rien à voir avec les headers http) avec le menu du forum
-un bloc Path qui indique l'endroit où on se trouve par rapport à l'index. (Index > Nom de la Catégorie > nom de la sous catégorie > nom du Forum > Sujet > etc...)
-Un bloc ListOfCategories (donc liste des catégories , sous catégories et forums)
-Un Bloc Footer
Pour chaque bloc, j'ai au moins une classe modèle et une classe vue.
Pour mon index.php j'ai donc le IndexController, une facade qui gère les différents modèles dont les vues ont besoin IndexFacade, une vue générale IndexFrontView qui elle gère les différents vues des blocs ci-dessus et génère le HTML. Je n'utilise pas de moteurs de templates pour générer mon code mais une collection d'objets représentant chacun un élément HTML et ce qu'il contient. Chaque vue renvoit un objet Div que le FrontView se contente de concaténer dans le body de la page.
En fait avec un schéma ça sera plus clair :
Déjà est ce que c'est une bonne approche du modèle MVC ?
Ensuite mes doutes se situe plus au niveau de la manière de passer les données des modèles aux vues. Pour le moment, chaque modèle à une méthode GetData qui renvoie un ArrayObject contenant toutes les données que la vue correspondante à besoin. La vue les récupère dans un SetData().
Le Set data parcours le ArrayObject et créer les propriétés à la volée grâce à __set.
En gros ça donne quelque chose comme ça pour la création de la page :
Méthode de l'IndexController :
Ensuite dans l'index.php il n'y a que :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public function RunDefaultAction(){ global $Registre; // les modules qu'on veut affichés $this->FrontView->AddView("Header")->AddView("LastChange")->AddView("Path")->AddView("ListOfCategory")->AddView("Path")->AddView("Statistics")->AddView("Footer"); $this->FrontModel->SetModelList(array_keys($this->FrontView->view_needed)); // On va demandé au modele de récupérer les données nécessaires à la vue $this->FrontView->view_needed["ListOfCategory"]->SetData($this->FrontModel->model_needed["ListOfCategory"]->GetData()); $this->FrontView->view_needed["Path"]->SetData($this->FrontModel->model_needed["Path"]->GetData()); $this->FrontView->view_needed["Header"]->SetData($this->FrontModel->model_needed["Header"]->GetData()); $this->FrontView->view_needed["Footer"]->SetData($this->FrontModel->model_needed["Footer"]->GetData()); }
Pour chaque action différente sur ma page index comme par exemple Marquer les topics comme lu, je vais avoir une méthode dans mon controller comme celle ci dessous.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 $controller = new IndexController(); // On analyse les données $controller->ParseQuery(); $controller->FrontView->Render();
Est ce une bonne manière de procéder ?
Merci déjà de m'avoir lu jusqu'au boutet merci d'avance pour vos futurs commentaires.
Jo.
Partager