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

时间:2011-12-28 07:20:12

标签: php model-view-controller zend-framework architecture

在我们的设置中,我们为所有数据库对象提供了模型+映射器。然后是控制器动作,它们根据业务逻辑为各个动作准备模型对象。

我们已经将整个模型对象发送到视图,如果view(html)想要显示名字,它可以调用$obj->getFirstName()或者其他视图(pdf)甚至可以调用$obj->getFullName()。这是应该怎么做的?

如果国家/地区空置且视图无意中调用$obj->getCountry()->getISO3Code()将会致命,因为getCountry()返回false而不是预期的国家/地区对象。

一种选择是使用IF等来打扰视图,这样它就变得安全了。但它是否会破坏视图应该在没有逻辑的情况下转储的目的?或者我可能过分强调它。

我们应该将整个模型对象发送到视图(如现在)还是安全地准备并发送可查看字段数组?它有点让行动知道PDF视图的样子和html视图的样子,再次可能会破坏控制器的目的。

1 个答案:

答案 0 :(得分:2)

我承认我在同样的问题上挣扎。当控制器/操作在视图中设置值 - $this->view->someKey = 'someValue' - 然后隐含期望控制器知道视图需要什么。我想一般的想法是这没关系;视图负责如何呈现传递的数据。

在view-scripts中使用if语句没有任何问题。看到类似的东西很常见:

<?php if ($someCondition): ?>
<!-- some markup here -->
<?php endif; ?>
在视图脚本中

。例如,查看与分页控件关联的部分内容。

我创建了视图模型对象 - 一种旨在用于视图的我的模型的只读版本 - 这允许我在视图脚本中做一些更清洁的事情。例如,您可以使用类似hasCountry()的方法创建视图模型对象,以便您的视图脚本可以执行以下操作:

<?php if ($viewmodel->hasCountry()): ?>
<p>Country: <?= $model->getCountry()->getISO3Code() ?></p>
<?php endif; ?>

有点像一个简单的例子,但是对于我想要呈现的实体的更复杂的逻辑,我发现像这样的视图模型为某些特定于渲染的逻辑提供了一个主页控制器,对于视图脚本来说似乎有点复杂。