【问题标题】:Does user input go to the controller or model?用户输入是否进入控制器或模型?
【发布时间】:2011-05-06 16:30:56
【问题描述】:

现在我已经拆分了模型,但我的控制器和视图仍然组合在一个 12k 行的文件中。我一直在寻求为此创建一个真正的 MVC 系统,拆分视图,但是在寻找要拆分的内容时,我注意到我的控制器正在做很多可能属于模型的工作。

例如,假设我有...

if (isset($_POST['write'])) {
    $obj = $objManager->get($_POST['id']);
    $obj->setFoo($_POST['foo'])
        ->setBar($_POST['bar']);
    $objManager->write($obj);
    echo ... 
}

...所以我们知道 echo 之后的内容进入了视图模板。经理是我的榜样。所以我的问题是,我是否从 $_POST 读取所有数据并在控制器中设置数据?还是我以某种方式将其放入模型中,就像这样...

if (isset($_POST['write'])) {
    $objManager->update($_POST);
    echo ...
}

...update() 基本上做同样的事情,设置变量并保存事物。

【问题讨论】:

  • 控制器中有$_POST 和update() 和write() 是可以的,但是,您可以将回声移出,并将它们严格地放在您的视图中
  • 控制器通常会做所有的数据修改,模型有我相信的数据库结构,视图会做所有关于以最终形式显示数据的事情。

标签: php model-view-controller separation-of-concerns


【解决方案1】:

您的第一个示例对我来说似乎是更好的解决方案。它正确地将接受用户输入的任务与访问模型中的数据分开。换句话说,模型并不关心输入来自 POST 参数这一事实。

在第二个示例中,您将模型与控制器紧密耦合,因为模型希望将 POST 参数列表传递给它以更新对象。模型不必关心“id”、“foo”和“bar”变量的来源。

第二个例子看起来更优雅一些,但它对单元测试不太友好。为了对其进行单元测试,您必须向它传递一个关联数组,其键与 POST 参数的名称匹配。这在 PHP 中没什么大不了的,因为所有内容都是动态类型的,但这是您需要担心的另一件事。

【讨论】:

    【解决方案2】:

    让控制器处理所有用户输入并远离模型内部的 $_POST 变量,而是让控制器填充模型是很常见的。要获得更多关于 MVC 方法的观点,您可以看看其他框架是如何做到的,例如,E.G. Zend Framework

    【讨论】:

      【解决方案3】:

      思考 MVC 的一个好方法是问自己:“如果我在视图层中更改了 X,我必须在控制器或模型层中进行哪些更改?”

      理想情况下,模型层应该能够独立于视图层而存在,因为它充当应用程序的核心 API。对视图的更改不应要求在模型中进行返工。

      控制器接受外部输入(例如来自用户),调用模型层对其进行处理,然后确定提供哪个视图作为响应。

      在您的示例中,$_POST 包含原始输入,并且 $_POST 数组中的键由它们在您的大部分 HTML 视图中的编码方式指定。您不应该期望您的模型知道 $_POST 中的有效键是什么,或者这些值是否需要清理、转换等。将该工作留给控制器,这应该保证它传递给模型的值将满足模型层类/函数所期望的条件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-13
        • 2012-06-15
        • 1970-01-01
        相关资源
        最近更新 更多