用户输入是否转到控制器或型号?

时间:2011-05-06 16:30:56

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

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

例如,假设我有......

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

...所以回声后的东西,我们知道进入视图模板。经理是我的模特。所以我的问题是,我是否从$ _POST读取并在控制器中设置数据?或者我会以某种方式将其放入模型中,就像这样......

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

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

3 个答案:

答案 0 :(得分:1)

让控制器处理所有用户输入并保持在模型内部的$ _POST变量之外是相当普遍的,而是让控制器填充模型。为了更好地了解MVC方法,您可以了解其他框架如何实现它,E.G。 Zend Framework

答案 1 :(得分:1)

考虑MVC的好方法是问自己,“如果我在视图层中更改了X,那么我需要在Controller或模型层中进行哪些更改?”

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

Controller是外部输入(例如来自用户),调用Model层来处理它,然后确定要提供哪个视图作为响应。

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

答案 2 :(得分:1)

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

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

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