将数据从MVC Controller传递到PHP中的View

War*_*tto 15 php model-view-controller controller view

对于我正在研究的一些项目,我有自己的手动PHP MVC框架.当我第一次创建框架时,它是在构建管理CMS的上下文中.因此,模型,视图和控制器之间存在非常好的一对一关系.数据库中有一行,它映射到单个模型.控制器加载模型并将其传递给要渲染的视图(例如进入编辑表单).很好,干净,容易.

但是,现在我正在网站的前端工作,事情变得棘手了.页面并不总是单个模型的视图.它可能是一个包含20个用户的用户目录(每个用户模型).此外,可能存在关于请求的元数据,例如分页(当前页面,总页数,结果数量)和/或搜索查询.

我的问题是,将所有这些数据传递给视图的最简洁方法是什么?

我正在考虑的一些选择:

  • 让控制器创建一个数组并将其作为单个参数传递给视图:

    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
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 在视图类中创建属性并让控制器填充它们:

    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();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 为视图提供某种泛型HashMap或Collection对象作为容器,可以容纳任意数量和数据名称.

    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();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

我知道技术上任何一个都可以工作,但我不确定最佳选择,或者是否有一个更好或更传统的选择,我缺少.

Pet*_*ley 4

我将推荐胖模型、瘦控制器的概念(或者,如果您愿意的话,胖模型瘦控制器......)

换句话说,您的模型过于严格 - 将您的模型绑定为仅表示像 RowDataGateway 这样的东西是极其有限的。

事实上,我认为好的模型隐藏了您正在从数据库读取数据的事实。因为,实际上,您的数据可能位于文本文件中,或者来自网络服务,或者其他什么。如果您将模型视为只是一个美化的 DBAL,那么您注定会在控制器中拥有紧密耦合的代码,而这不会让您摆脱“数据仅来自数据库”的思维方式。