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

Posted

技术标签:

【中文标题】模型视图控制器:将定期显示的信息从控制器发送到视图【英文标题】:Model view controller: Sending regularly displayed information to the view from controller 【发布时间】:2015-05-21 18:45:05 【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

【参考方案1】:

您对更优雅方式的怀疑是正确的,“纯”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 框架,以直接解决您现在的问题,即“我需要小部件”问题。 http://en.wikipedia.org/wiki/Hierarchical_model%E2%80%93view%E2%80%93controller

【讨论】:

以上是关于模型视图控制器:将定期显示的信息从控制器发送到视图的主要内容,如果未能解决你的问题,请参考以下文章

将信息发送到我在导航控制器中返回的视图

如何将核心数据信息从表视图传递到视图控制器?

将信息从视图发送到控制器

将数组从自定义单元格发送到另一个视图控制器

是否可以将模型数据从视图发送到不是该视图的控制器的控制器?

将信息从视图控制器发送到另一个