【问题标题】:MVC confusion passing data from view to model via controllerMVC 混淆通过控制器将数据从视图传递到模型
【发布时间】:2010-11-30 21:15:55
【问题描述】:

如果从控制器提供视图,是否可以通过 post 传递在该视图中生成的数据并将其直接传递给模型,或者我是否需要返回为视图提供服务的控制器并从控制器调用模型?

【问题讨论】:

    标签: model-view-controller codeigniter


    【解决方案1】:

    在 CodeIgniter 中,视图从控制器获取数据,控制器解复用/验证参数并从模型中检索适当的数据。重要的是:

    1. 视图是输出。视图不直接与模型耦合,因为它们定义了 HTML/XML/JSON/CSS(页面、页面的逻辑部分或输出数据,如 API 和资源)。这意味着您不会从 CI 中的视图调用模型。

    2. 控制器是代理。控制器和模型不产生输出。控制器接受 GET 和 POST 请求并发出视图所需的调用以打印结果,通常检查参数并多路复用多个模型调用以获取所有适当的数据。

    3. 模型获取和放置数据。模型应该以不可知的格式返回其数据:作为模型的数据对象,或者作为更通用(但一致)的数据散列。返回的模型数据越清晰,您的视图和模型之间的耦合就越少(并且您能够重用模型片段的次数越多)。

    在 CodeIgniter 中有几个地方你可能会发现重叠:

    • JavaScript 通常最终与视图相关(并且可能会执行验证等操作,通常是控制器任务)。您可以通过将 Javascript 移出视图来改进这一点(对于较大的部分效果很好,对于较小的部分效果较差)。
    • 在 PHP 中,返回哈希(键/值数组)比返回对象更容易(代码更少,但类型安全性降低)。这通常是耦合的来源。
    • 共享输出内容通常会进入控制器(您可以通过将其移动到 CI 帮助程序库中来避免这种情况)。

    目标是让您的视图不知道您的模型,除非它们从它们那里接收符合特定规范的数据。控制器只是获取和放置(它们既不生成 HTML 输出,也不直接访问数据),模型大多是 SQL 或其他形式的获取数据并将其填充到结构化的东西中。

    【讨论】:

      【解决方案2】:

      在与 MVC 无关的方法中,我会说返回到模型的视图是 correct approach。纯粹主义者可能会说总是回到控制器。

      来自here的评论...

      模型管理行为和 应用领域的数据, 回应信息请求 关于它的状态(通常来自 查看),并响应指令 改变状态(通常从 控制器)。

      短语“通常”是关键。模式在某种程度上是为了下游的可管理性和可维护性。有时模式会阻碍以可维护和可管理的方式实现目标,有时会被过度使用。

      我认为在这种情况下(小规模)采用任何一种方式都可以……但这也与您如何在应用程序范围内解决问题有关。

      【讨论】:

      • 所以我会从视图中调用模型?
      • 我仍然不明白如何在不向视图添加太多代码的情况下从视图调用模型。我希望模型使用来自视图中的
        的数据进行 SQL 查询。在调用模型之前,我真的需要检查表单是否已在视图中提交吗?感觉好像视图中的代码太多了。
      • @Roger 返回查询的模型在哪里?对控制器?如果是这样,那么从视图到控制器再到模型……这不是问题。同样,我的评论是不可知的评论,而不是 CodeIgniter 特定的评论。
      【解决方案3】:

      是的,您将表单数据提交给控制器函数。然后该函数处理数据并调用视图。

      如果你尝试任何其他方式,你最终会陷入代码地狱。

      一个函数可以处理表单的原始显示和该表单的提交。

      只需检查表单是否已提交,如果已提交,则处理其数据,否则显示表单。

      function login(){
      
        if($this->input->post('submitted')==1){
      
          //process the form data
      
        }else{
      
          //show the form
      
        }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2010-11-25
        • 1970-01-01
        • 1970-01-01
        • 2015-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多