我是否正确理解了Web开发中的MVC?

时间:2012-02-20 12:15:47

标签: php model-view-controller design-patterns

好的 - 我一直在关注MVC设计模式,需要澄清它的工作方式。我已经做了很多阅读,但是因为我是DP的新手,所以对我来说都很模糊。

在MVC中,模型将为我处理我的数据库工作。这似乎是最简单的部分。

控制器将处理处理 - 处理表单,从模型中获取数据等。

对我来说问题是观点。假设我正在循环遍历数据库查询的结果集。循环结果时,我可能需要执行if / else。现在,通常看起来会在视图中完成 - 但这似乎与我相反。一旦你需要开始执行像View中那样的检查,看起来视图不再仅仅用于显示,而是用于处理逻辑,就像控制器一样。我还想象这可能会导致视图中的代码混乱,但这是另一回事。

那么,View是一个可以在代码上放置少量操作的好地方,还是在其他地方我应该放置那些代码?我知道我可以在其他地方的库中创建一个类方法,但这似乎会让事情变得非常复杂。

我用PHP标记了它,因为它是我使用的主要语言。

5 个答案:

答案 0 :(得分:2)

ASP .NET MVC开发人员,但鉴于问题的性质,我不确定这是否重要。

我尝试将视图视为呈现特定操作所需的一切。这将包括与特定业务概念相关的内容,但也包括分页和其他非特定于域特定问题的概念,但仍需要在页面上进行一些表示。

现在,在代码操作方面,从某种意义上说,你可以做很多事情。您的页面的一部分可能依赖于,例如,正在填充的集合以及其中包含的内容。我没有真正的问题坚持使用简单的条件结构来处理这样的事情。这是代码,但你可以说它不是重要的代码。我们本身并没有执行工作,只是根据视图的内部状态来抑制某些元素的显示。

我认为这适用于很多简单的条件显示逻辑。

但是,如果您发现自己正在执行比这更复杂的事情,那么最好更改模型以减少视图工作量。例如如果你在视图侧标记中执行一些令人讨厌的链式三元组,你可能希望考虑将该逻辑封装在模型的构造中,而不是将它留给视图进行整理。

总而言之,虽然简单的开/关表示结构在视图中通常是可以的(如果有点混乱),但如果您发现视图代码变得过于复杂或不可维护,请考虑在模型上创建额外的属性等。

答案 1 :(得分:1)

根据经验;在您的视图中,唯一允许的逻辑是表示逻辑。所以这是完全允许的,你将在几乎每个MVC应用程序中遇到这样的逻辑;

<?php 
// assuming you have an array with data you want to display
foreach($array as $value):
    if($value < 0):
        $extrastyle = ' style="color: red"';
    else:
        $extrastyle = '';
    endif;
    ?>
    <span<?php echo $extrastyle; ?>><?php echo $value; ?></span>
<?php endforeach; ?>

但如果你是。在视图中从模型中检索数据,而不是从事控制器工作的事情。所以不要害怕在视图中使用某些逻辑,只要它是显示数据的逻辑。所有准备工作都应在您的控制器中完成。如果您怀疑逻辑是否是显示数据的逻辑,请根据您的直觉做出选择。

- 请注意我故意使用替代符号(if(expr):endif;),因为它是一种在视图中使用此符号的约定(使用php)。在非常规的情况下,您可以使用标准符号。此外,我建议使用三元运算符($extrastyle = ($value < 0): ' style="color: red"':'';

答案 2 :(得分:0)

如何在视图和控制器之间分配代码在很大程度上取决于您正在使用的MVC实现(框架)。

通常,拥有与视图内部的表示有关的逻辑肯定是可以的,而不仅仅是将视图限制为实际的模板。

答案 3 :(得分:0)

我认为你对MVC的定义过于严格。对于网页,您通常对“控制器”有两个注意事项:服务器端或客户端。

在您的示例中,条件明显(如果是这种情况,则执行某些操作,如果不执行其他操作)通常会在有交互的情况下应用,并且可能触发客户端或服务器端条件。

此外,可以认为数据本身可以启动条件上下文:如果数据是a那么做b。这可能是模型中的条件。

关键是你还在做什么并不完全清楚。

答案 4 :(得分:0)

在MVC中,视图必须尽可能笨,控制器应该是瘦的,而模型是胖的。

如果需要在视图中编写if/else语句,大多数MVC框架“Helpers”(例如ASP.NET具有HtmlHelpers)有助于隐藏条件语句。

但是,通常只要视图中有很多条件语句,就意味着你没有遵循MVC模式,因为 MVC的意思是分离责任所以在这些情况下,应该将视图与这种条件语句分为多个视图。

我建议阅读Jeff Atwood's article