在Zend中发送数据到MVC视图的正确方法


Proper way to send data to MVC Views in Zend

在我们的设置中,我们有所有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; ?>

这是一个微不足道的例子,但是对于我试图渲染的实体的更复杂的逻辑,我发现像这样的视图模型为一些渲染特定的逻辑提供了一个家,这些逻辑在控制器中感觉不对,对于视图脚本来说似乎有点复杂。