这两条经常说的MVC建议似乎相互矛盾:
假设我有$项必须作为无序列表输出。是不是迭代逻辑绑定了html?在哪种情况下,我应该把它放在哪里?
在我看来,可重用性主张将其放在视图之外的其他位置,同时为模板作者提供标签,类等的参数。
你怎么看?您认为如此的实际原因非常受欢迎。答案 0 :(得分:0)
当然你可以在视图中放置循环 - 你还要怎样渲染<ul>
? :))
您也可以添加一些条件逻辑,例如根据授权状态在右上方打印“Logout”与“Login”,主要是在模板的共享部分。
重点是视图层必须与它呈现的数据完全无关:他是一堆数组/对象和浏览器中呈现的实际HTML之间的一种诡计。 提供此类数据是一种控制器问题,即做出所有决定,过滤内容等等。
考虑一下webservices:你可以用不同的格式呈现相同的资源[xml,json,plain html] - 它是从任何地方获取数据的控制器,然后视图接受它并呈现一个适当的文件。
答案 1 :(得分:0)
在处理视图模板上的列表和表格时,您总会遇到某种循环。您听到人们认为在模板中添加视图逻辑是个坏主意的原因与 ViewModel范例有关。
有时仅循环数据是不够的,例如:
<?php foreach( $users as $user ): ?>
<?php if ( in_array( $user->getId(), $members ) ): ?>
<!-- Users is member -->
在这种特定情况下,user entity
没有方法isMember()
来检查用户是否是成员。假设您正在使用随用户实体一起提供的第三方模块,并且您不希望扩展此模块以添加新的依赖项(例如,组)。您必须检查域模型之外的 ,才能正确显示视图模板,如上例所示。
但是,在这种情况下,我们在视图中添加逻辑:if ( in_array( $user->getId(), $members ) )
。您应该将其置于业务逻辑或视图逻辑中。后一个是使用 ViewModels 实现的。因此,它不会让您的视图与域模型对象进行交互,而是与ViewModel 交互,后者将实现isMember()
方法并封装上述逻辑。
此范例的主要思想是您的视图无权访问域模型,而只是与ViewModel交互,保持视图独立于域模型。
<强>更新强>
例如,如果您有设计/前端团队,则不允许他们使用 ViewModel 调用$user->setName()
而只是$user->getName()
,您不会包含此内容方法作为一种选择。
还有另一个例子:假设你的应用程序有皮肤/主题。如果您保留视图逻辑,就像在视图模板的第一个示例中一样,您需要为具有类似模板的所有主题复制此逻辑。将模板分离后,您将避免在视图模板中传播重复的视图逻辑。