我已经阅读了一段时间有关MVC设计的内容,官方说法是View调用Model中的对象和方法,构建并输出视图。
我认为这主要是错误的。
控制器应该在模型内部操作和检索/更新对象,选择合适的视图并将信息传递给它以便展示。只有简单的PHP变量/条件语句可以出现在视图中。
如果视图从模型中获取它需要展示的信息,那么视图中肯定会有很多PHP代码——完全违反了分离表示层逻辑的目的。
我已经阅读了一段时间有关MVC设计的内容,官方说法是View调用Model中的对象和方法,构建并输出视图。
我认为这主要是错误的。
控制器应该在模型内部操作和检索/更新对象,选择合适的视图并将信息传递给它以便展示。只有简单的PHP变量/条件语句可以出现在视图中。
如果视图从模型中获取它需要展示的信息,那么视图中肯定会有很多PHP代码——完全违反了分离表示层逻辑的目的。
没有一种绝对正确的MVC实现方式,可以存在多种变体。
例如,除了让View主动查询Model外,Controller还可以使用某种通知机制通知View有关Model中任何更改。在这种情况下,View只是监听更新,然后呈现它们。
<li><?=$item->description?></li>
<li><?=$item->getDescription()?></li>
<li><?=$item['description']?></li>
我认为你是完全正确的 - 视图不应该调用模型中的方法。就像其他人所说,MVC有各种变化,但重点是将逻辑、数据和输出分离。
通常情况下,您需要一个控制器作为应用程序的起点。在PHP中,这将是您的index.php文件。至少,此文件将处理输入数据(即查询字符串或URL参数)。最好为应用程序的不同部分添加单独的控制器。
然后,每个控制器只需决定需要显示哪些数据,从模型中获取它,并将其传递给视图。在PHP中,您将调用各种类/方法从数据库中获取数据,并将其存储在变量中。
然后,您只需包含另一个PHP文件,其中包含大部分HTML,但带有一些PHP回显变量。循环也可以。如果您有一系列事物,您可能想要执行以下操作:
<ul>
<?php foreach ($items as $item) : ?>
<li><?=$item?></li>
<?php endforeach; ?>
</ul>
MVC不是一成不变的法则。根据你阅读的来源,它可能会有所不同。就个人而言,我不允许视图直接从模型中读取。
更新 这篇文章也有一些很好的例子。模型是具有start()方法的汽车引擎,视图是具有paint()或change()方法的汽车颜色,控制器是驾驶员。我更喜欢让控制器驱动汽车并启动引擎,而不是让轮子或油漆来做。
:)
getDescription()
,我认为这取决于getDescription
实际执行的操作。如果它仅使用帮助函数以复杂的方式格式化代码,则可以接受。但是,如果它导致进行 SQL 查询,那么这不是一个好主意;这是控制器从模型获取数据的工作。 - Gary Green