每个页面一个View对象?或者只是一个视图对象加载不同的模板


A View object per page? or just one View object loading different templates?

在我的应用程序中,我有一个View对象,它可以load($template)一个模板,以使它准备好使用render()方法进行渲染。

在我读过的所有关于Views的东西中,有时我看到人们像我现在这样做,有时我看到人们像下面这样做

class ProductView extends View {
}
class CheckoutView extends View {
}

每页有一个单独的View

这两种方式的优点/缺点是什么?

View不应该是"loading templates"。如果视图中有$this->load('header');这样的代码,那么它就违反了SRP。视图(有时)使用模板为用户创建响应,但它不应该创建它们。

在您将遇到的大多数关于视图的文章中,您将阅读关于从Rails(及其克隆)中解释视图的文章。在RoR中你没有视图。只是一个美化了的哑模板。

表示层的结构使得控制器和视图之间的关系最好是1:1。每个视图都负责处理由用户输入触发的响应。因此:您的页面通常在每次执行时间有一个视图。

在更复杂的情况下,您可能需要了解复合视图的概念。这种方法允许您将表示逻辑分成更小的块。如果您使用ViewModel,这也使构建代码变得容易得多。

最重要的是:如果你在整个应用程序中只有一个视图,那么你就做错了。

每页一个视图绝对是最适合web的。注意,我指的不是每个控制器一个视图,而是每个不同的页面。您希望拥有不同的模板,这些模板可以被不同的视图调用(例如页眉、页脚或导航栏)。

例如,在BlogPostView中,您可以输入:

$this->load('header');
$this->load('post', $data);
$this->load('footer');

,然后使用:

$this->render();

没有"唯一正确的解"。但对我来说,视图必须尽可能简单。像printf函数一样。您想扩展打印行为吗?我不这么认为!