MVC组件如何组合在一起?

时间:2009-10-21 11:23:40

标签: php model-view-controller

我已经看到了很多MVC组件在网络上组合在一起的例子。


Controller从模型中检索数据并将其传递给View

这看起来有点冗长和混乱。

$model = new Model;
$view = new View;
$view->set('foo', $model->getFoo());
$view->display();

Controller将模型传递给视图

如果View需要来自多个模型的数据,该怎么办?

$model = new Model;
$view = new View($model);
$view->display(); //View takes what is needed from the Model

Controller将View传递给模型

$view = new View;
$model = new Model($view);
$view->display(); //Model has told the View what is needed

其中哪一种是最好的方式?如果没有,那是什么?

5 个答案:

答案 0 :(得分:8)

Controller从模型中检索数据并将其传递给视图

正如你所说的那样冗长而凌乱。但这是MVC理念下最合适的解决方案。

Controller将模型传递给视图

似乎也有效。但是,视图需要一些模型方法。这并不是真正的MVC精神。您的视图应该只呈现提供给它的数据,而不关心上下文。

Controller将视图传递给模型

忘了那一个。这里很乱。

答案 1 :(得分:1)

如果您认为“模型”是中心工件(可能跨应用程序使用),并且“视图”可能(或可能不)知道特定模型,那么答案是不言而喻的(但是定义)(可能是抽象的)模型的“视图”,并且可能在应用程序之间可用。 “控制器”管理交互,是模式中应用程序特定的元素,因此最终需要了解模型和视图细节。

如果视图特定于给定模型,则可以使用选项2。 如果视图是针对抽象模型的(并且您可以使用它来显示来自一组模型的信息),则使用选项1.

选项3完全错误。

答案 2 :(得分:1)

原始问题的答案是:

  1. Controller从模型中检索数据并将其传递给视图
  2. MVC实际上非常整洁干净。记住它正在解决的问题:

    1. 代码重用(模型不依赖于控制器或视图。视图不依赖于控制器或模型。控制器是特定于应用程序的。)

    2. 逻辑分离(例如,将身份验证后端从MySQL更改为LDAP需要0更改为视图。更改视图的布局需要0更改为模型。更改数据库表结构需要0更改控制器或视图)。

    3. 现在,如果您希望从表结构自动生成表单,则视图现在绑定到表(紧密耦合)。表中的更改需要更改视图(尽管可能是自动更改)。这可能需要更少的代码 - 但是从代码重用的角度来看,视图不再可靠。

      同样,你的观点(在MVC中)应该只是模板。应该没有逻辑 - 只是变量。所有“逻辑”,即业务规则,都驻留在控制器中。这些模型知道如何获取数据并使其保持标准化。视图知道如何显示数据。控制器知道何时使用数据以及将数据应用于哪些视图。

      MVC是一种严格的3层架构。两层架构对某些应用程序有效。对于快速mashup和“完成垃圾”,一个绑定的架构可能是合适的(但你没有得到样式点)。

      希望这有帮助。

答案 3 :(得分:0)

恕我直言,选项2(控制器将模型传递给视图)最好保持关注点的正确解耦和分离。如果视图需要多个模型,则传入的模型应该是包含视图所需的每个模型的复合数据类型。 “视图所需的每个模型”通常与您的实体模型不同,因为它被展平并简化以便显示,通常称为ViewModel。

选项1( Controller从模型中检索数据并将其传递给视图)与选项2非常相似,但我认为选项2更可取,因为它在控制器中放置的逻辑更少。在MVC中,尽可能多的逻辑应该在模型中,使控制器和视图尽可能简单。

答案 4 :(得分:0)

我倾向于同意第二个。 Web上的MVC无法在更多有状态的应用程序中实现。大多数Web MVC实现都让您将逻辑放在控制器中并使用模型进行原始数据访问。我认为更正确的方法是将您的逻辑放在模型中。几乎有一个隐含的第四层,原始数据访问是在模型中完成的,但是模型也负责赋予该数据意义并更新视图。

wikipedia article解释得非常好。