MVC:我应该在哪里格式化数据?

时间:2010-09-14 12:12:34

标签: php model-view-controller model view controller

我从Model(包含数据的数组)获取数据,我需要以特定格式显示。我需要迭代数组,格式化数据然后显示它。我应该在哪里格式化数据?在模型,控制器或视图中? 谢谢。

6 个答案:

答案 0 :(得分:5)

对数组进行迭代并在视图中显示数据。因此我也会在视图中进行格式化。如果格式化很复杂和/或需要大量代码,请将其放在辅助函数中。

例如:

查看:

<?php foreach($array as $item): ?>
    <p><?php echo format_function($item); ?></p>
<?php endforeach; ?>

助手:

function format_function($text)
{
    // Do some formatting here...
    return $formatted_text;
}

答案 1 :(得分:2)

如果您的viewdata包含来自不同模型的数据,或者只有1个模型的精选部分,您可以创建一个ViewModel,然后您可以使用Automapper进行映射。

ViewModels有几个优点。他们清楚地使用,整理您的数据,可以增加安全性,......

答案 2 :(得分:2)

您可以在View.Not模型中执行此操作 在视图中,您可以执行特定操作(转换/条件/)

答案 3 :(得分:2)

如果你正在开展一个更大的项目,我建议你有一个额外的层或类负责将你的对象(即域模型对象)转换为数据传输对象(视图模型对象)。

否则应用在视图中进行格式化的建议:)

转换可能涉及格式化字符串,小数(货币),日期时间等。 也可以将对象图(看看我的例子)转换成平面DTO。

控制器负责调用映射算法。

因此,在视图中,您不必迭代对象的引用。相反,您使用平坦的格式良好的视图模型。

你的观点不会混乱,看起来很干净。

.NET世界中提供了执行此转换作业的工具。它被称为AutoMapper。也许在PHP中有一个等价物。

以下是

的示例

这是一个对象模型: alt text

您可以将其转换为此智能视图模型:

alt text

此方法的优点:

  • 分离关注

  • 清洁视图

  • 没有代码重复,即在每个视图中格式化日期时间。 (不要重复自己!)

此方法的缺点:

  • 一开始很贵,所以很少有项目不会从这种方法中获利

答案 4 :(得分:2)

演示!=数据格式化。请考虑以下示例:

一家国际商店,有一个产品页面,有关产品尺寸的各种信息,等等。由于商店的国际性,对于访问商店的每个区域,此数据的格式应不同。例如:在欧洲,测量值显示为度量值,而美国客户端显示格式为英制值的相同数据。 / p>

一个重要的注意事项是,对于每种格式,不应该多次存储这种特定类型的数据,尽管有关价格的数据应该如此。这是因为每个地区的产品价格不同。另一方面,测量和日期在不同的地区是普遍相同的;只有他们显示和格式化的方式不同。应始终以尽可能少的冗余存储信息。

此类商店的视图部分(或任何基于MVC的应用程序,除此之外)除了呈现数据和确定如何向用户呈现此数据之外,不应做任何其他事情。视图不应以任何方式更改数据本身。这正是为什么有关测量和时间的信息应以 ISO标准化格式存储的原因,这使得将数据格式化为其他格式变得更加容易。例如,测量值应存储为度量值。在从数据库中检索数据集之后,每个语言环境的数据的实际格式应该在模型中进行,最好是使用静态可访问的Helper类,以获得最大的灵活性。格式化数据后,它将返回到控制器,然后控制器将其返回到当前视图。

这种处理数据格式化方式的另一个重要优点是,当您尝试通过无视图操作(即通过AJAX检索的JSON对象)获取数据集时,您的数据仍将正确格式化。以任何方式(通过“普通”HTML模板或作为JSON / XML字符串)发送回客户端的数据不应该有所不同;只有呈现的方式。

答案 5 :(得分:1)

在您的视图中执行此操作,因为它负责演示。

原因

  • 没有这样做模型是你可以使用相同的数据渲染不同的视图(否则你需要创建不同的数据集),
  • 没有在控制器中执行是因为它不是Controller的责任

请参阅MVC background reading