对于我正在从事的一些项目,我有自己的手动 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 } }
在视图类中创建属性并让控制器填充它们:
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(); } }
为视图提供某种通用的 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(); } }
我知道从技术上讲,任何一种方法都可以,但我不确定最佳选择,或者我是否缺少更好或更传统的选择。