模型视图控制器:从控制器向视图发送定期显示的信息

时间:2015-03-18 19:40:44

标签: php oop model-view-controller view controller

我之前曾问过这个问题,但没有得到答案。我试图学习模型视图控制器模式,并为学习目的开发一个简单的框架。

我知道很难对php采用mvc模式,大多数流行的框架都使用mvc变种(包括我自己),而不是实际模式本身。在大多数这些变化中:控制器从用户获取输入并将其发送到模型,模型处理此输入并将响应返回给控制器,并且在最后一步中,控制器选择适当的视图并基于模型和信息将信息发送到该视图。 #39;的回应。

在我的设计中,控制器使用一个看起来像这样的视图实例:

class view {
    public function render($filename){
        require_once "templates/$filename.php";
    }
    public function addData($key,$value){
        $this->{$key}=$data;
    }
}

在此上下文中,控制器将定期显示的信息发送到视图的最佳方式是什么?

举一个例子,假设我们有一个社交网络应用程序,它有一个向用户显示通知的顶层菜单。此菜单是视图的核心部分,显示在应用程序的每个页面上。据我了解,这意味着一旦用户登录到应用程序,控制器必须在每个操作方法中向视图实例添加通知信息。

我想知道是否有更优雅的方法来做到这一点。

1 个答案:

答案 0 :(得分:1)

您对更优雅方式的怀疑是正确的,而“纯粹”MVC并不是这类复杂应用的最佳解决方案。 Angular.JS和其他使用单页面应用程序样式设计的框架从一个角度解决了这个问题。这些问题的另一个答案是 HMVC或MVVC 设计模式。根据应用程序的需要,使用这些模式的组合。

要在MVC思维模式中更直接地回答您的问题,您应该使用继承自LoggedInUserController 之类的控制器。该控制器总是会加载通知等模型。这些视图同样也是LoggedInUserView的扩展,它始终具有通知的占位符,并且知道如何使用该通知模型。

class LoggedInUserController extends MVCController {   
  protected function init() {
    $this->_top_menu_model = new TopUserMenuModel('getAllMenuModels');
    $this->_footer_model = new UserFooterModel('getAllMenuModels');
    //any other essential widget models
  }
}

class UserPage1 extends LoggedInUserController {
  function init() {
    parent::init();
    //other code here
  }
}

还有许多其他方法,应用程序的功能,大小和预算应该推动设计。

您希望通过“我需要小部件”问题来查看HMVC框架,以直接回答您现在的工作方式。 http://en.wikipedia.org/wiki/Hierarchical_model%E2%80%93view%E2%80%93controller