代码之家  ›  专栏  ›  技术社区  ›  Gary Green

mvc:模型-视图-控制器-视图调用模型吗?

  •  6
  • Gary Green  · 技术社区  · 16 年前

    我已经阅读了一段时间关于mvc设计的文章,看起来视图正式地调用了模型中的对象和方法,构建并输出了一个视图。

    我认为这主要是错误的。

    控制器应该在模型中操作和检索/更新对象,选择适当的视图并将信息传递给它,以便它可以显示。视图中只应出现粗糙和粗糙的php变量/simple if语句。

    如果视图从模型中获得了需要显示的信息,那么视图中肯定会有很多php——完全违反了分离表示逻辑的观点。

    7 回复  |  直到 12 年前
        1
  •  8
  •   Robert Höglund    15 年前

    和所有编程一样,我们需要务实。视图应该只包含表示逻辑。这个逻辑可能非常简单,也可能非常复杂。只要该逻辑只处理屏幕上显示的内容、报告上打印的内容等。

    控制器应该在模型中操作和检索/更新对象,选择适当的视图并将信息传递给它,以便它可以显示。

    你传递的是什么信息?可能是模型的子集。您可以创建一个新类,该类只包含视图应该知道的信息,或者只传递模型,并确保只访问适当的数据。无论如何,视图应该可以自由查询这个传入的模型,以便能够显示视图。

    争论的焦点是,如果你能从这个角度直接更新模型,绕过控制器。这就是务实的一面。我认为有些情况下可以直接更新模型。尤其是如果您可以使用数据绑定。可以将文本框指定给模型的属性,并自动进行更新。如果有很多简单的属性设置,这种方法可以在控制器中保存一堆代码。mvc不是一成不变的规则。正确使用时可以产生更好的代码,但如果使用过于严格,则会导致痛苦和痛苦。

    要务实!

        2
  •  9
  •   Eric Eijkelenboom    16 年前

    没有一种绝对正确的方法可以实现mvc。变化是可能的。

    例如,控制器可以使用某种通知机制将模型中的任何更改通知视图,而不是让视图主动查询模型。在这种情况下,视图只是监听更新,然后这些更新会被呈现出来。

        3
  •  3
  •   Tom Dalling    16 年前

    这可能不是人们所说的“纯”mvc,但我想,只要视图php代码没有改变模型,这也不是什么大不了的事情。mvc最重要的规则是模型不知道视图。不了解模型的视图就不那么重要了。

    直接使用模型的主要缺点是视图不能与其他模型一起重用。这很少是个问题,因为视图几乎总是特定于一种特定类型的模型对象(或其列表)。

        4
  •  2
  •   Community Mohan Dere    9 年前

    以下修改是否 DisgruntledGoat's code snippet 被认为太“复杂”?应该将对象传递到视图吗?

    <li><?=$item->description?></li>
    

    或者?

    <li><?=$item->getDescription()?></li>
    

    我见过几个只使用数组的例子:

    <li><?=$item['description']?></li>
    
        5
  •  1
  •   troelskn    16 年前

    mvc指的是层,而不是组件。所以它们是更抽象的概念,而不是蓝图。由于不可能完全分离这些层(信息必须在它们之间流动),这实际上是一个连续统一体,在一个极端的系统上有意大利面,在另一个极端的系统上有官僚作风。你可能想在这两者之间找个地方。

    我通常不会在控制器视图分离上花费太多精力。模型和(控制器视图)之间的分离更为重要。

        6
  •  1
  •   Community Mohan Dere    9 年前

    MVC不是一成不变的法律。这取决于你从哪里读到的,它可能有所不同。我个人不允许视图直接从模型中读取。

    更新 这个 post 也有一些很好的例子。模型是使用start()类似方法的汽车引擎,视图是使用paint()或change()方法的汽车颜色,控制器是驱动程序。我更喜欢让控制器驱动汽车并启动发动机,而不是让车轮或油漆来驱动。

    :)

        7
  •  1
  •   DisgruntledGoat    16 年前

    我认为您绝对正确-视图不应该调用模型中的方法。正如其他人所说,mvc有一些变化,但它的重点是将逻辑与数据从输出中分离出来。

    所以通常,您有一个控制器,它是应用程序的起点。在php中,这将是index.php文件。这个文件至少会处理输入数据(即查询字符串或url参数)。为应用程序的不同部分添加单独的控制器通常是一个好主意。

    然后,每个控制器简单地决定需要显示哪些数据,从模型中获取数据,并将其传递给视图。在php中,您可以调用各种类/方法来从数据库中获取数据,并将其存储在变量中。

    然后,您只需包含另一个php文件,该文件主要包含html,但包含一些php回显变量。循环也很好。如果你有一个清单,你可能想做这样的事情:

    <ul>
    <?php foreach ($items as $item) : ?>
      <li><?=$item?></li>
    <?php endforeach; ?>
    </ul>
    
    推荐文章