Model view controller 在MVC中使用与视图相关的For循环
这两条常说的MVC建议似乎相互矛盾:Model view controller 在MVC中使用与视图相关的For循环,model-view-controller,design-patterns,Model View Controller,Design Patterns,这两条常说的MVC建议似乎相互矛盾: 视图中的循环或条件逻辑不适用 除了视图,任何地方都没有HTML 假设我有$items必须作为无序列表输出。迭代逻辑中不一定有html吗?在那种情况下,我应该把它放在哪里 在我看来,重用性主张将其放在视图之外的某个位置,同时为模板作者提供标记、类等的参数 你觉得怎么样?你这样认为的实际原因是非常受欢迎的 当然,您可以在视图中放置循环-您还打算如何渲染s?:) 您还可以添加一些条件逻辑,例如,根据授权状态在右上角打印“注销”与“登录”,主要是在模板的共享部分 关
你觉得怎么样?你这样认为的实际原因是非常受欢迎的 当然,您可以在视图中放置循环-您还打算如何渲染
s?:)
您还可以添加一些条件逻辑,例如,根据授权状态在右上角打印“注销”与“登录”,主要是在模板的共享部分
关键是视图层必须完全不知道它所呈现的数据:它是一堆数组/对象和浏览器中呈现的实际HTML之间的中间人。
提供这样的数据是一个控制者的事情,也就是说,做出所有的决定,过滤东西,等等
想想Web服务:您可以以不同的格式呈现相同的资源[xml、json、纯html]——是控制器从任何地方获取数据,然后视图获取数据并呈现适当的文档。在处理视图模板上的列表和表时,您总会遇到某种循环。你听到人们争论在模板中添加视图逻辑是个坏主意的原因与视图模型范式有关 有时仅仅循环数据是不够的,例如:
<?php foreach( $users as $user ): ?>
<?php if ( in_array( $user->getId(), $members ) ): ?>
<!-- Users is member -->
在这种特定情况下,用户实体
没有检查用户是否为成员的方法isMember()
。假设您使用的是用户实体附带的第三方模块,并且您不想扩展该模块以添加新的依赖项(例如组)。您必须在域模型之外选中此,以正确显示视图模板,如上例所示
但是,在本例中,我们正在向视图添加逻辑:如果(在数组中($user->getId(),$members))
。您可以将其放在业务逻辑中,也可以放在视图逻辑中。后者是通过使用视图模型实现的。因此,它将与ViewModel进行交互,而不是让您的视图与域模型对象进行交互,ViewModel将实现isMember()
方法并封装上述逻辑
这个范例的主要思想是,您的视图没有访问域模型的权限,相反,它只与ViewModels交互,保持视图独立于域模型。
更新
例如,如果您有设计/前端团队,您将不允许他们调用$user->setName()
,而只允许$user->getName()
使用ViewModel,您将不包括此方法作为选项
还有另一个例子:假设您的应用程序具有皮肤/主题。如果保留视图逻辑(如视图模板上的第一个示例中所示),则需要为具有类似模板的所有主题复制该逻辑。将模板解耦后,可以避免视图模板中出现重复的视图逻辑。“当然可以在视图中放置循环”是的,我也一直这么认为,但我看到有人在这里说了其他的话。它似乎确实创建了大量分散在视图中的冗余代码。ViewModels似乎将我们置于纯术语领域。ViewModels是什么,是与视图关联的次要逻辑任务的函数集合?在实践中,与教条主义的方式相反,仅仅在模板中填充逻辑是如何改进的?我希望看到有人拿出真正常见的web应用程序用例,并描述哪一部分在哪里得到最佳处理。@MikeGirard如果更新的答案解决了您的问题,请告诉我