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

Model view controller: Sending regularly displayed information to the view from controller

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

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

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

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

在这种情况下,控制器将定期显示的信息发送到视图的最佳方式是什么?

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

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

您对更优雅的方式的怀疑是正确的,"pure"MVC 不是像这样的复杂应用程序的最佳解决方案。 Angular.JS 和其他使用 single-page-app 样式设计的框架从一个角度解决了这个问题。这些问题的另一个答案是 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 框架,以直接回答您现在所采用的方式,但遇到 "I need widgets" 问题。 http://en.wikipedia.org/wiki/Hierarchical_model%E2%80%93view%E2%80%93controller