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