Passer des données de MVC Controller à View en PHP
J'ai ma propre roulés à la main en PHP MVC pour certains projets sur lesquels je travaille. Lorsque j'ai créé le cadre, c'est dans le contexte de la construction d'un admin CMS. Donc, il y avait un très beau one-to-one relation entre le modèle, vue et contrôleur. Vous avez une seule ligne dans la DB, ce qui correspond à un modèle unique. Le contrôleur de charge le modèle et le transmet à la vue d'être rendus (par exemple dans un formulaire d'édition). Beau, propre et facile.
Cependant, maintenant que je suis en train de travailler sur le front-end du site, les choses deviennent collantes. Une page n'est pas toujours vue d'un modèle unique. Il pourrait être un utilisateur de la liste des répertoires avec 20 utilisateurs (chacun, un modèle d'Utilisateur). En outre, il pourrait y avoir des métadonnées sur la demande, telles que la pagination (page en cours, le nombre total de pages, le nombre de résultats) et/ou d'une requête de recherche.
Ma question est, quelle est la façon la plus propre de passer toutes ces données pour les afficher?
Certaines options que je suis en train d'étudier:
- Ont le contrôleur de créer un tableau et le passer à la vue que d'un seul paramètre:
class UserController{ public function renderView(){ //assume there's some logic to create models, get pagination, etc. $data = array() $data['models'] = $models; $data['currentPage'] = $current; $data['totalPages'] = $total; return $view->render($data); } } class UserView{ public function render($data){ //render the data } }
- Créer des propriétés dans la classe de la vue et ont le contrôleur de les remplir:
class UserView{ public $models; public $currentPage; public $totalPages; } class UserController{ public function renderView(){ //assume there's some logic to create models, get pagination, etc. $view = new UserView(); $view->models = $models; $view->currentPage = $current; $view->totalPages = $total; return $view->render(); } }
- Donner le point de vue une sorte de générique de la table de hachage ou un objet de Collection comme un conteneur qui peut contenir n'importe quel nombre et le nom des données.
class UserView{ public $collection = new Collection(); //works like a Java collection } class UserController{ public function renderView(){ //assume there's some logic to create models, get pagination, etc. $view = new UserView(); $view->collection->add($models,'models'); $view->collection->add($currentPage,'currentPage'); return $view->render(); } }
Je sais que techniquement tout de la pourrait travail, mais je ne suis pas sûr de le meilleur choix, ou si il y a mieux ou plus classiques de choix que je suis absent.
source d'informationauteur Warren Benedetto
Vous devez vous connecter pour publier un commentaire.
Je vais vous recommander le concept de Modèles De Matières Grasses, Skinny Contrôleurs (ou, Modèles De Matières Grasses Mince Contrôleurs si vous préférez...)
Dans otherwords, votre modèle est trop strict - le lien de votre modèle pour représenter quelque chose comme un RowDataGateway est extrêmement limité.
En fait, je pense, de bons modèles cacher le fait que vous êtes en train de lire les données à partir d'une base de données à tous. Car, en réalité, vos données pourraient être dans des fichiers texte, ou à partir d'un service web, ou quoi que ce soit. Si vous traitez votre Modèle comme rien de plus qu'une simple DBAL, vous vous condamner à avoir étroitement couplés code dans vos contrôleurs qui juste ne pas vous laisser sortir de la "uniquement les données proviennent de la base de données" façon de penser.
J'ai vu les deux premiers méthodes mises en œuvre dans populaire MVC/création de modèles de cadres de.
django utilise la première méthode, en passant à la vue d'un dictionnaire des variables qui la vue utilise pour remplir le modèle.
smarty utilise la deuxième méthode, la création d'un objet Smarty et assigner des valeurs à chaque les propriétés dans le conteneur.
Votre troisième méthode semble être essentiellement le même que le second, avec de légères différences au niveau des architectures.
Vraiment, je crois que je n'ai pas dit quoi que ce soit que vous n'avez pas pensé déjà. Fondamentalement, ce sont tous les sons idées, afin de mettre en œuvre ce que vous sentez que vous êtes plus à l'aise avec.
Dans celui que j'utilise, il a automatiquement a une propriété en vue dans le contrôleur que vous pouvez accéder à des méthodes et des propriétés de la vue. Toutes les propriétés publiques sont alors accessibles dans la vue de la vue '$cette " depuis la vue est rendue dans son propre contexte des objets.
Dans le contrôleur:
Et dans la vue:
Il en va de même pour la mise en page depuis le sont à la fois des instances distinctes du point de vue même de l'objet:
Puis dans la mise en page:
Le cadre utilisé pour être propriétaire, mais est sur le point d'être dévoilée au grand public. Je serais heureux de vous envoyer un peu de code, si vous pensez que ça vous intéresserait. Rappelez-vous, la réponse la plus simple est généralement la meilleure réponse.