在我们的设置中,我们有所有db对象的模型和映射器。然后还有控制器动作,它们根据业务逻辑为各自的动作准备模型对象。
我们已经将整个模型对象发送给视图,如果视图(html)想要显示名字,它可以调用$obj->getFirstName()
,或者如果其他视图(pdf)甚至可以调用$obj->getFullName()
。这是应该做的吗?
如果country为空并且视图无知地调用$obj->getCountry()->getISO3Code()
将是致命的,因为getCountry()
返回false而不是预期的country对象。
一个选择是用IF来干扰视图。等等,所以它是安全的。但是,这难道不违背视图应该在没有逻辑的情况下被转储的目的吗?也可能是我太强调了。
我们应该将整个模型对象发送给视图(就像现在一样)还是安全地准备并发送一个可查看字段数组?它让我们知道PDF视图和html视图是什么样子的,这可能违背了控制器的目的我承认我也有同样的问题。当控制器/动作在视图($this->view->someKey = 'someValue'
)中设置值时,有一个隐含的期望,即控制器知道视图需要什么。我想一般的想法是,这是可以的;视图负责如何呈现传递给它的数据。
在视图脚本中使用if
语句没有错。好像很常见:
<?php if ($someCondition): ?>
<!-- some markup here -->
<?php endif; ?>
在视图脚本中。例如,查看与分页控件关联的部分。
我已经创建了视图模型对象——一种只读版本的模型,打算在视图中使用——它允许我在视图脚本中做一些更干净的事情。例如,您可以有一个带有hasCountry()
方法的视图模型对象,这样您的视图脚本就可以执行如下操作:
<?php if ($viewmodel->hasCountry()): ?>
<p>Country: <?= $model->getCountry()->getISO3Code() ?></p>
<?php endif; ?>
这是一个微不足道的例子,但是对于我试图渲染的实体的更复杂的逻辑,我发现像这样的视图模型为一些渲染特定的逻辑提供了一个家,这些逻辑在控制器中感觉不对,对于视图脚本来说似乎有点复杂。